01 源代碼可任意下載的重大漏洞終于大規模爆發
2018年的第一天,微信小程序被爆出驚天BUG:任何人可以通過AppID和版本號獲取任意小程序的源碼文件!
該漏洞被大范圍曝光起源于V2EX論壇一篇關于使用微信小游戲“跳一跳”不校驗post的漏洞進行刷分技術文章,文章同時給出了獲取跳一跳小游戲源碼的獲取方法。文章備注,此種獲取源碼的方法對于小程序也是通用的。
方法非常簡單:只要獲取到小程序的appid和版本號,即可通過構造URL直接下載該小程序的源碼wxapkg文件。
理論上,小程序的appid和版本號是只有開發者本人知道的,除非小程序開發者公布,其他人員無從獲取。而技術層面上,我們卻可以通過對小程序和服務器的通信進行抓包獲取到小程序appid和版本號。這就使得下載小程序源碼變得輕松異常。
微信小程序官方稱在當天修復了通過構造URL下載源碼的漏洞,目前,已無法使用構造URL的方式直接下載小程序執行包。
這個鍋應該由誰來背?
有開發者次日在V2EX爆料稱,該漏洞是由于小程序CDN服務商沒有給訪問做URL鑒權導致的。服務器開發我并不熟悉,此處不站隊。
實際上,通過構造URL的方式下載小程序源碼只是其中被曝光了的一個方式,我們的手機里其實已經保存了所有我們使用過的小程序執行包,對于root的安卓手機,我們可以在appbrand文件中找到所有已經使用過的小程序wxapkg文件。
只是命名規則比混亂,但這比抓包和構造URL的方法降低了對技術的要求。
之所以在標題使用“終于大規模爆發”,是因為這兩種獲取小程序源碼的方法早在2017年6月就有開發者發文給出了,而那位開發者寫文更多的是對前端代碼安全的討論。
02 更有討論價值的恰恰是前端代碼的安全問題
小程序大部分功能的實現都是基于前端的,很多開發者為了省掉域名備案和SSL證書部署的麻煩,將小程序的大部分功能都寫在了前端。在被抓包和提取執行包不可避免的情況下,就要求小程序官方采取足夠的代碼安全保護措施。
而這一點,小程序開發團隊做的不是很好。
使用前文的任意方法獲取到小程序的執行文件,用Python版腳本(不得不佩服我們的程序員,在短短的一天時間內,出現了Python、PHP和js三個版本的解包腳本)對下載的wxapkg文件解包后得到這么幾個文件
解碼后的小程序文件目錄
可以發現這些文件的組成和小程序的代碼已經非常相似了。與常規小程序代碼不同的是,解包的文件格式仍然是HTML文件。
但這不是重點。
打開page-frame.html和app-service.js,可以發現這些代碼已經非常具備可讀性了:
對于熟悉小程序開發的人來說,這樣的代碼已經幾乎不需要再格式化了,現有文件已經可以比較清楚地看出代碼的邏輯。
回到代碼保護。
我們獲取到的wxapkg文件其實是小程序的執行文件,可以簡單理解為安裝包。安卓手機的安裝包(xxx.apk文件)大家否非常熟悉,我們是很難通過apk文件獲取到應用源代碼的,因為代碼壓縮有非常復雜的加密過程,很難被反編譯。但為什么小程序的執行包就可以被輕松地“反編譯”?(用“反編譯”其實已經非常高估小程序了,你可以發現前面我都是使用了“解包”這個詞,因為小程序的“反編譯”過程非常簡單,就像解壓縮一樣。)
小程序的執行文件之所以可以如此輕松地被反編譯,根源在于小程序的開發團隊并沒有對小程序的執行文件進行有效的保護,也就是加密。使用Hex Fiend(一款Mac OS上的十六進制編輯轉件)分析wxapkg文件會發現,大部分字段是沒有被加密的,可以直接看到文件的路徑。
實際上,小程序只是很簡單的將圖片、js和json文件壓在一起,而壓制的過程無非就是Wxml --> Html、 Wxml --> JS、Wxss --> Css,轉換后文件二進制格式跟后綴名為wx二進制格式完全一致。這就使得解包過程非常簡單,所以出現了一天之內涌現出Python、PHP和JS三個版本解包代碼的情況。
其實,早在2017年10月份,就有開發者在簡書分享了對小程序執行包的提取和解析過程,并在GitHub開源了腳本代碼。
03 SO?
開發者Rolan在文章《從微信小程序看前端代碼的安全》中提到:
微信并沒有在代碼安全上進行過多的考慮。這導致需要在應用審核過程中花費比較多的功夫(也就是自己給代碼加密),不然作品太容易被復制竄改,以至于會失去渠道先機,這對流量是致命打擊。由于歷史原因,前端的代碼安全技術發展的比較緩慢,相比其他被編譯成二進制的應用,前端這種純文本應用,太容易被辨識與竄改。
對前端代碼進行保護的目的在于讓機器容易識別相關的指令,而使人難以理解代碼的邏輯,但往往在對前端代碼進行保護過程中,很難既兼顧指令效率又能使可讀性降低。因此,常常需要在現有的代碼中增加一些額外的驗證邏輯,例如一些增加無效的代碼進行混淆、采用守護代碼保護業務代碼不能在其他的域名下正常運行、增加一些防止調試跟蹤的斷點等,這些措施都是使得破解代碼時人工成本增加,從而增加代碼的安全性。
這篇文章是2017年6月發布的,早與小程序源碼大范圍泄漏前半年!半年前就已經被開發者意識到的安全問題,小程序開發團隊卻至今沒有發現,或者像Rolan說的“并沒有在代碼安全上進行過多的考慮”。
近乎開源的源代碼對于開發者而言,已經幾乎沒有任何盈利的可能性。當前互聯網環境下,個人開發者(或小型開發團隊)在沒有足夠資金和流量支持的情況下,先發優勢是他們唯一可以使用的資源,而代碼的安全性是對先發優勢的絕對保護。
一旦代碼被開源,優質小程序可能會迅速被不懷好意的資本和流量持有方抄襲取代。
在大張旗鼓宣傳“原創”的微信生態下,被持續賦能一年的小程序,竟然存在如此嚴重的“原創保護”漏洞,而漏洞被爆出5天之后,小程序竟然沒有采取任何有效的措施,甚至連對開發者的提醒都沒有。
發個公告,就這么掉面子么?
這是一個大廠應該表現出的責任心?
這樣并不完整的產品,卻在不斷地被賦能,到底價值幾何?
給瘸子打上興奮劑,他也能跑的很快。
但不把腿治好,想通過不斷打興奮劑讓他一直跑下去么?
小程序開發團隊的回復似乎是“嗯”:
—————? 碎碎念? —————
遙想當年,我們發布在公眾號的文章被抄襲搬運到某條、某魚、某家賺取流量收益時,我們問天無路;
再看當下,我們發布在微信的小程序被不收任何阻攔的下載、解析,修改復用后再次發布賺取收益,我們又是問地無門。
當媒體人的版權被侵害,他們會申訴,會發聲,他們會讓全世界都知道他們沒有被重視;
而程序員不會,他們習慣沉默,習慣“忍氣吞聲”,當他們不再被重視時,只會選擇默默地離開。
那些代碼可是我用狗命加班熬夜換來的,存在GitHub被下載了還能收獲個“星”,發布到小程序你們下載了卻連個招呼都不打。摔。