你的小程序代碼已被開源,但微信官方并不想背鍋

01 源代碼可任意下載的重大漏洞終于大規(guī)模爆發(fā)

2018年的第一天,微信小程序被爆出驚天BUG:任何人可以通過AppID和版本號獲取任意小程序的源碼文件!

該漏洞被大范圍曝光起源于V2EX論壇一篇關于使用微信小游戲“跳一跳”不校驗post的漏洞進行刷分技術文章,文章同時給出了獲取跳一跳小游戲源碼的獲取方法。文章備注,此種獲取源碼的方法對于小程序也是通用的。

方法非常簡單:只要獲取到小程序的appid和版本號,即可通過構造URL直接下載該小程序的源碼wxapkg文件。

理論上,小程序的appid和版本號是只有開發(fā)者本人知道的,除非小程序開發(fā)者公布,其他人員無從獲取。而技術層面上,我們卻可以通過對小程序和服務器的通信進行抓包獲取到小程序appid和版本號。這就使得下載小程序源碼變得輕松異常。

微信小程序官方稱在當天修復了通過構造URL下載源碼的漏洞,目前,已無法使用構造URL的方式直接下載小程序執(zhí)行包。

這個鍋應該由誰來背?

有開發(fā)者次日在V2EX爆料稱,該漏洞是由于小程序CDN服務商沒有給訪問做URL鑒權導致的。服務器開發(fā)我并不熟悉,此處不站隊。

實際上,通過構造URL的方式下載小程序源碼只是其中被曝光了的一個方式,我們的手機里其實已經(jīng)保存了所有我們使用過的小程序執(zhí)行包,對于root的安卓手機,我們可以在appbrand文件中找到所有已經(jīng)使用過的小程序wxapkg文件。

只是命名規(guī)則比混亂,但這比抓包和構造URL的方法降低了對技術的要求。

之所以在標題使用“終于大規(guī)模爆發(fā)”,是因為這兩種獲取小程序源碼的方法早在2017年6月就有開發(fā)者發(fā)文給出了,而那位開發(fā)者寫文更多的是對前端代碼安全的討論。

02 更有討論價值的恰恰是前端代碼的安全問題

小程序大部分功能的實現(xiàn)都是基于前端的,很多開發(fā)者為了省掉域名備案和SSL證書部署的麻煩,將小程序的大部分功能都寫在了前端。在被抓包和提取執(zhí)行包不可避免的情況下,就要求小程序官方采取足夠的代碼安全保護措施。

而這一點,小程序開發(fā)團隊做的不是很好。

使用前文的任意方法獲取到小程序的執(zhí)行文件,用Python版腳本(不得不佩服我們的程序員,在短短的一天時間內(nèi),出現(xiàn)了Python、PHP和js三個版本的解包腳本)對下載的wxapkg文件解包后得到這么幾個文件

解碼后的小程序文件目錄

可以發(fā)現(xiàn)這些文件的組成和小程序的代碼已經(jīng)非常相似了。與常規(guī)小程序代碼不同的是,解包的文件格式仍然是HTML文件。

但這不是重點。

打開page-frame.html和app-service.js,可以發(fā)現(xiàn)這些代碼已經(jīng)非常具備可讀性了:

page-frame.html代碼截圖
app-service.js

對于熟悉小程序開發(fā)的人來說,這樣的代碼已經(jīng)幾乎不需要再格式化了,現(xiàn)有文件已經(jīng)可以比較清楚地看出代碼的邏輯。

回到代碼保護。

我們獲取到的wxapkg文件其實是小程序的執(zhí)行文件,可以簡單理解為安裝包。安卓手機的安裝包(xxx.apk文件)大家否非常熟悉,我們是很難通過apk文件獲取到應用源代碼的,因為代碼壓縮有非常復雜的加密過程,很難被反編譯。但為什么小程序的執(zhí)行包就可以被輕松地“反編譯”?(用“反編譯”其實已經(jīng)非常高估小程序了,你可以發(fā)現(xiàn)前面我都是使用了“解包”這個詞,因為小程序的“反編譯”過程非常簡單,就像解壓縮一樣。)

小程序的執(zhí)行文件之所以可以如此輕松地被反編譯,根源在于小程序的開發(fā)團隊并沒有對小程序的執(zhí)行文件進行有效的保護,也就是加密。使用Hex Fiend(一款Mac OS上的十六進制編輯轉件)分析wxapkg文件會發(fā)現(xiàn),大部分字段是沒有被加密的,可以直接看到文件的路徑。

實際上,小程序只是很簡單的將圖片、js和json文件壓在一起,而壓制的過程無非就是Wxml --> Html、 Wxml --> JS、Wxss --> Css,轉換后文件二進制格式跟后綴名為wx二進制格式完全一致。這就使得解包過程非常簡單,所以出現(xiàn)了一天之內(nèi)涌現(xiàn)出Python、PHP和JS三個版本解包代碼的情況。

其實,早在2017年10月份,就有開發(fā)者在簡書分享了對小程序執(zhí)行包的提取和解析過程,并在GitHub開源了腳本代碼。

03 SO?

開發(fā)者Rolan在文章《從微信小程序看前端代碼的安全》中提到:

微信并沒有在代碼安全上進行過多的考慮。這導致需要在應用審核過程中花費比較多的功夫(也就是自己給代碼加密),不然作品太容易被復制竄改,以至于會失去渠道先機,這對流量是致命打擊。由于歷史原因,前端的代碼安全技術發(fā)展的比較緩慢,相比其他被編譯成二進制的應用,前端這種純文本應用,太容易被辨識與竄改。

對前端代碼進行保護的目的在于讓機器容易識別相關的指令,而使人難以理解代碼的邏輯,但往往在對前端代碼進行保護過程中,很難既兼顧指令效率又能使可讀性降低。因此,常常需要在現(xiàn)有的代碼中增加一些額外的驗證邏輯,例如一些增加無效的代碼進行混淆、采用守護代碼保護業(yè)務代碼不能在其他的域名下正常運行、增加一些防止調試跟蹤的斷點等,這些措施都是使得破解代碼時人工成本增加,從而增加代碼的安全性。

這篇文章是2017年6月發(fā)布的,早與小程序源碼大范圍泄漏前半年!半年前就已經(jīng)被開發(fā)者意識到的安全問題,小程序開發(fā)團隊卻至今沒有發(fā)現(xiàn),或者像Rolan說的“并沒有在代碼安全上進行過多的考慮”。

近乎開源的源代碼對于開發(fā)者而言,已經(jīng)幾乎沒有任何盈利的可能性。當前互聯(lián)網(wǎng)環(huán)境下,個人開發(fā)者(或小型開發(fā)團隊)在沒有足夠資金和流量支持的情況下,先發(fā)優(yōu)勢是他們唯一可以使用的資源,而代碼的安全性是對先發(fā)優(yōu)勢的絕對保護。

一旦代碼被開源,優(yōu)質小程序可能會迅速被不懷好意的資本和流量持有方抄襲取代。

在大張旗鼓宣傳“原創(chuàng)”的微信生態(tài)下,被持續(xù)賦能一年的小程序,竟然存在如此嚴重的“原創(chuàng)保護”漏洞,而漏洞被爆出5天之后,小程序竟然沒有采取任何有效的措施,甚至連對開發(fā)者的提醒都沒有。

發(fā)個公告,就這么掉面子么?

這是一個大廠應該表現(xiàn)出的責任心?

這樣并不完整的產(chǎn)品,卻在不斷地被賦能,到底價值幾何?

給瘸子打上興奮劑,他也能跑的很快。

但不把腿治好,想通過不斷打興奮劑讓他一直跑下去么?

小程序開發(fā)團隊的回復似乎是“嗯”:

—————? 碎碎念? —————

遙想當年,我們發(fā)布在公眾號的文章被抄襲搬運到某條、某魚、某家賺取流量收益時,我們問天無路;

再看當下,我們發(fā)布在微信的小程序被不收任何阻攔的下載、解析,修改復用后再次發(fā)布賺取收益,我們又是問地無門。

當媒體人的版權被侵害,他們會申訴,會發(fā)聲,他們會讓全世界都知道他們沒有被重視;

而程序員不會,他們習慣沉默,習慣“忍氣吞聲”,當他們不再被重視時,只會選擇默默地離開。

那些代碼可是我用狗命加班熬夜換來的,存在GitHub被下載了還能收獲個“星”,發(fā)布到小程序你們下載了卻連個招呼都不打。摔。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,048評論 25 709
  • 轉載鏈接 注:本文轉載知乎上的回答 作者:初雪 鏈接:https://www.zhihu.com/question...
    pengshuangta閱讀 29,314評論 9 295
  • 1、姑娘,我今年25歲。。。 今晚頗有點大言不慚,掐指算算,其實我快26了。我享受25歲的時光里,越來越短暫。還是...
    YIBAO閱讀 446評論 4 29
  • 第二篇:《禮儀深入骨髓》 一年一度的除夕之夜到了,這一整天大人們都在高興的忙活著,小孩們也都在盡情的玩耍著...
    詩人張三閱讀 107評論 0 3

友情鏈接更多精彩內(nèi)容