這其實(shí)是前幾天看到 B 站代碼被開源后的一個(gè)感想,為什么要冒這么大風(fēng)險(xiǎn)去做這事,活著不好嗎?到底是 996 讓你瘋狂?還是不給漲薪還克扣工資?或者黑了你的蔡徐坤?鬼知道為什么會(huì)有這想法。 然后腦子里就冒出了一個(gè)更奇怪的想法,如果我要在代碼里下毒,要怎么做?
如何在 Android 代碼中下毒
這其實(shí)是前幾天看到 B 站代碼被開源后的一個(gè)感想,為什么要冒這么大風(fēng)險(xiǎn)去做這事,活著不好嗎?到底是 996 讓你瘋狂?還是不給漲薪還克扣工資?或者黑了你的蔡徐坤?鬼知道為什么會(huì)有這想法。
然后腦子里就冒出了一個(gè)更奇怪的想法,如果我要在代碼里下毒,要怎么做?
友情提示:如果你是一個(gè)管理者,或者一個(gè)項(xiàng)目的負(fù)責(zé)人,讀完以后請(qǐng)盡快去檢查你公司的代碼,小心被人下毒了。
Android 工程的幾個(gè)風(fēng)險(xiǎn)
隨手寫一段奇葩代碼在項(xiàng)目中,這不算下毒,畢竟這種毒分分鐘就被查出來了,還有可能成為控訴你的證據(jù)。
要說下毒,首先要講的就是幾個(gè)容易下毒的點(diǎn)了。
- 現(xiàn)在的 Android 工程都是使用 Gradle 管理依賴庫(kù)了。但是 Gradle 有一個(gè)非常奇葩的特性,允許你依賴一個(gè) snapshot 包,而這個(gè)特性正常情況下甚至是無法被關(guān)閉的(特殊情況走自定義除外)。
- ContentProvider 居然是可以自動(dòng)執(zhí)行的,只要在 manifest 文件中聲明了你的 ContentProvider,并且保證這個(gè) ContentProvider的 authorities 不會(huì)與其他的沖突,它的onCreate()方法就可以在應(yīng)用啟動(dòng)的時(shí)候被自動(dòng)執(zhí)行。當(dāng)然,沖突了你也裝不上。
- Android 保留了遠(yuǎn)程代碼執(zhí)行能力,盡管現(xiàn)在的插件化手段越來越困難,但那些也都是限制在系統(tǒng)組件層面,如果只是想單純的在遠(yuǎn)程執(zhí)行一段 helloworld 程序,這實(shí)在太簡(jiǎn)單。
- Android 截至目前都沒有一個(gè)正常的,可以確保退出的方法(別告訴我System.exit()算你的正常退出)。而當(dāng)你調(diào)用System.exit()的時(shí)候,任何一個(gè)異常處理函數(shù)都不會(huì)有記錄,因?yàn)樗孛淳筒皇莻€(gè)異常。
- 原生函數(shù)居然可以讓 JAVAScript 直接調(diào)用,并且還沒任何權(quán)限問題,只要知道入口函數(shù),任何一個(gè)網(wǎng)頁(yè)的 js 都能調(diào)用。雖然 API17以后本地要加上 @JavaScriptInterface注解的,這已經(jīng)是進(jìn)步了。但是這貨他到現(xiàn)在居然都還是個(gè) runtime 注解,結(jié)合第三條,其實(shí)沒什么鳥用。
- 我不想寫了,寫再多可能要出事了。
配毒藥
上面這幾條,隨便兩三點(diǎn)混合起來,都是致命的。畢竟,無形裝逼,最為致命。
舉個(gè)栗子:
我在職的時(shí)候,隨便在代碼里面丟個(gè) jcenter 的 snapshot 包依賴,此刻這個(gè)包是沒有任何風(fēng)險(xiǎn)的。 離職了以后,通過遠(yuǎn)端,覆蓋掉這個(gè) snapshot 包,在關(guān)鍵代碼中下點(diǎn)毒,寫個(gè)異常或者上面說的 System.exit()。此刻,這個(gè)包就有風(fēng)險(xiǎn)了。
稍微聰明一點(diǎn),改進(jìn)一下,在依賴的時(shí)候依賴一個(gè)正式包。但是依賴的這個(gè)正式包,再去依賴一個(gè) snapshot 包,同樣可行。
上面的步驟有個(gè)問題,就是這個(gè)關(guān)鍵的代碼,他本身有可能不會(huì)被執(zhí)行到。在改進(jìn)一下,在 snapshot 這個(gè) aar 里用上第二條說的:用 ContentProvider 在應(yīng)用啟動(dòng)的時(shí)候,就開始下毒,隨便開個(gè)線程,延遲個(gè)隨機(jī)數(shù),再根據(jù)時(shí)間戳做個(gè)取模,隨機(jī)一批用戶,調(diào)用System.exit(),不反編譯代碼,神仙來了也不知道包為什么莫名其妙就閃退了。
前面一種例子適合 snapshot 包的場(chǎng)景,經(jīng)常會(huì)有公司的打包機(jī)器是不允許連接外網(wǎng)的,其實(shí)很大程度就避免了這種問題。
只要你愿意,隨便網(wǎng)上丟一個(gè)class,再下載下來,通過ClassLoader直接 run 起來,一樣達(dá)到目的。
甚至你還可以限制再死一點(diǎn),你公司在深圳,那就深圳的 IP 全部執(zhí)行默認(rèn)邏輯,外地 IP 才開始下毒。總之只有你想不到,沒有你辦不到。
最后
哦對(duì)了,git 的提交者信息也都是可以改的。
git config user.name(email)
放手干去吧,搞死那些 996 的公司,不會(huì)有證據(jù)的,別說是我教你的。