01 源代碼可任意下載的重大漏洞終于大規(guī)模爆發(fā)
2018年的第一天,微信小程序被爆出驚天BUG:任何人可以通過AppID和版本號獲取任意小程序的源碼文件钻洒!
該漏洞被大范圍曝光起源于V2EX論壇一篇關(guān)于使用微信小游戲“跳一跳”不校驗post的漏洞進行刷分技術(shù)文章,文章同時給出了獲取跳一跳小游戲源碼的獲取方法锄开。文章備注素标,此種獲取源碼的方法對于小程序也是通用的。
方法非常簡單:只要獲取到小程序的appid和版本號院刁,即可通過構(gòu)造URL直接下載該小程序的源碼wxapkg文件糯钙。
理論上,小程序的appid和版本號是只有開發(fā)者本人知道的退腥,除非小程序開發(fā)者公布任岸,其他人員無從獲取。而技術(shù)層面上狡刘,我們卻可以通過對小程序和服務(wù)器的通信進行抓包獲取到小程序appid和版本號享潜。這就使得下載小程序源碼變得輕松異常。
微信小程序官方稱在當(dāng)天修復(fù)了通過構(gòu)造URL下載源碼的漏洞嗅蔬,目前剑按,已無法使用構(gòu)造URL的方式直接下載小程序執(zhí)行包疾就。
這個鍋應(yīng)該由誰來背?
有開發(fā)者次日在V2EX爆料稱艺蝴,該漏洞是由于小程序CDN服務(wù)商沒有給訪問做URL鑒權(quán)導(dǎo)致的猬腰。服務(wù)器開發(fā)我并不熟悉,此處不站隊猜敢。
實際上姑荷,通過構(gòu)造URL的方式下載小程序源碼只是其中被曝光了的一個方式,我們的手機里其實已經(jīng)保存了所有我們使用過的小程序執(zhí)行包缩擂,對于root的安卓手機鼠冕,我們可以在appbrand文件中找到所有已經(jīng)使用過的小程序wxapkg文件。
只是命名規(guī)則比混亂胯盯,但這比抓包和構(gòu)造URL的方法降低了對技術(shù)的要求懈费。
之所以在標(biāo)題使用“終于大規(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)非常具備可讀性了:
對于熟悉小程序開發(fā)的人來說金度,這樣的代碼已經(jīng)幾乎不需要再格式化了,現(xiàn)有文件已經(jīng)可以比較清楚地看出代碼的邏輯严沥。
回到代碼保護猜极。
我們獲取到的wxapkg文件其實是小程序的執(zhí)行文件,可以簡單理解為安裝包消玄。安卓手機的安裝包(xxx.apk文件)大家否非常熟悉跟伏,我們是很難通過apk文件獲取到應(yīng)用源代碼的丢胚,因為代碼壓縮有非常復(fù)雜的加密過程,很難被反編譯受扳。但為什么小程序的執(zhí)行包就可以被輕松地“反編譯”携龟?(用“反編譯”其實已經(jīng)非常高估小程序了,你可以發(fā)現(xiàn)前面我都是使用了“解包”這個詞勘高,因為小程序的“反編譯”過程非常簡單骨宠,就像解壓縮一樣。)
小程序的執(zhí)行文件之所以可以如此輕松地被反編譯相满,根源在于小程序的開發(fā)團隊并沒有對小程序的執(zhí)行文件進行有效的保護层亿,也就是加密。使用Hex Fiend(一款Mac OS上的十六進制編輯轉(zhuǎn)件)分析wxapkg文件會發(fā)現(xiàn)立美,大部分字段是沒有被加密的匿又,可以直接看到文件的路徑。
實際上建蹄,小程序只是很簡單的將圖片碌更、js和json文件壓在一起,而壓制的過程無非就是Wxml --> Html洞慎、 Wxml --> JS痛单、Wxss --> Css,轉(zhuǎn)換后文件二進制格式跟后綴名為wx二進制格式完全一致劲腿。這就使得解包過程非常簡單旭绒,所以出現(xiàn)了一天之內(nèi)涌現(xiàn)出Python、PHP和JS三個版本解包代碼的情況焦人。
其實挥吵,早在2017年10月份,就有開發(fā)者在簡書分享了對小程序執(zhí)行包的提取和解析過程花椭,并在GitHub開源了腳本代碼忽匈。
03 SO?
開發(fā)者Rolan在文章《從微信小程序看前端代碼的安全》中提到:
微信并沒有在代碼安全上進行過多的考慮矿辽。這導(dǎo)致需要在應(yīng)用審核過程中花費比較多的功夫(也就是自己給代碼加密)丹允,不然作品太容易被復(fù)制竄改,以至于會失去渠道先機袋倔,這對流量是致命打擊雕蔽。由于歷史原因,前端的代碼安全技術(shù)發(fā)展的比較緩慢奕污,相比其他被編譯成二進制的應(yīng)用萎羔,前端這種純文本應(yīng)用,太容易被辨識與竄改碳默。
對前端代碼進行保護的目的在于讓機器容易識別相關(guān)的指令贾陷,而使人難以理解代碼的邏輯缘眶,但往往在對前端代碼進行保護過程中,很難既兼顧指令效率又能使可讀性降低髓废。因此巷懈,常常需要在現(xiàn)有的代碼中增加一些額外的驗證邏輯,例如一些增加無效的代碼進行混淆慌洪、采用守護代碼保護業(yè)務(wù)代碼不能在其他的域名下正常運行顶燕、增加一些防止調(diào)試跟蹤的斷點等,這些措施都是使得破解代碼時人工成本增加冈爹,從而增加代碼的安全性涌攻。
這篇文章是2017年6月發(fā)布的,早與小程序源碼大范圍泄漏前半年频伤!半年前就已經(jīng)被開發(fā)者意識到的安全問題恳谎,小程序開發(fā)團隊卻至今沒有發(fā)現(xiàn),或者像Rolan說的“并沒有在代碼安全上進行過多的考慮”憋肖。
近乎開源的源代碼對于開發(fā)者而言因痛,已經(jīng)幾乎沒有任何盈利的可能性。當(dāng)前互聯(lián)網(wǎng)環(huán)境下岸更,個人開發(fā)者(或小型開發(fā)團隊)在沒有足夠資金和流量支持的情況下鸵膏,先發(fā)優(yōu)勢是他們唯一可以使用的資源,而代碼的安全性是對先發(fā)優(yōu)勢的絕對保護怎炊。
一旦代碼被開源谭企,優(yōu)質(zhì)小程序可能會迅速被不懷好意的資本和流量持有方抄襲取代。
在大張旗鼓宣傳“原創(chuàng)”的微信生態(tài)下结胀,被持續(xù)賦能一年的小程序赞咙,竟然存在如此嚴(yán)重的“原創(chuàng)保護”漏洞,而漏洞被爆出5天之后糟港,小程序竟然沒有采取任何有效的措施,甚至連對開發(fā)者的提醒都沒有院仿。
發(fā)個公告秸抚,就這么掉面子么?
這是一個大廠應(yīng)該表現(xiàn)出的責(zé)任心歹垫?
這樣并不完整的產(chǎn)品剥汤,卻在不斷地被賦能,到底價值幾何排惨?
給瘸子打上興奮劑吭敢,他也能跑的很快。
但不把腿治好暮芭,想通過不斷打興奮劑讓他一直跑下去么鹿驼?
小程序開發(fā)團隊的回復(fù)似乎是“嗯”:
—————? 碎碎念? —————
遙想當(dāng)年欲低,我們發(fā)布在公眾號的文章被抄襲搬運到某條、某魚畜晰、某家賺取流量收益時砾莱,我們問天無路;
再看當(dāng)下凄鼻,我們發(fā)布在微信的小程序被不收任何阻攔的下載腊瑟、解析,修改復(fù)用后再次發(fā)布賺取收益块蚌,我們又是問地?zé)o門闰非。
當(dāng)媒體人的版權(quán)被侵害,他們會申訴峭范,會發(fā)聲财松,他們會讓全世界都知道他們沒有被重視;
而程序員不會虎敦,他們習(xí)慣沉默游岳,習(xí)慣“忍氣吞聲”,當(dāng)他們不再被重視時其徙,只會選擇默默地離開胚迫。
那些代碼可是我用狗命加班熬夜換來的,存在GitHub被下載了還能收獲個“星”唾那,發(fā)布到小程序你們下載了卻連個招呼都不打访锻。摔。