由crossdomain.xml安全策略文件引發的一些列安全問題

這是一起由crossdomain.xml安全策略文件引發的思考,不是饅頭,也不是血案!!初識是在幾年前剛接觸Flex的時候,那會懵懵懂懂的解決問題,到如今與其打交道不計其數,這個大問題小問題都能輕鬆搞定,就是這樣愜意的陽光午後,我高高興興的寫着代碼,排着工期,整理文檔,計劃着今天又可以回家吃飯的時候,收到一封郵件,一封關於部署在都快被忘記的服務器上的flash跨域安全漏洞,要求緊急修復。

擦,what?這不是在搞笑吧,這尼瑪是啥?這又什麼東東?丈二和尚摸不着頭腦,安全漏洞?於是果斷的查找服務器策略文件,果不其然,沒部署,是的沒有部署安全策略文件,哎喲我去啊,這不是我乾的,我來的時候就有它了,吧啦吧啦的……說別的沒用啊,現在得解決問題啊,那就搞一個crossdomain.xml文件放到服務器下面唄,可不,啪啪啪,幾下鍵盤,2分鐘搞定,如此簡單的小問題,呵呵呵哈哈哈哈...就在哥以爲可以回郵件的時候,看到烏雲跨域漏洞字樣,打開瞅瞅是啥玩意,這一看不要緊,可嚇死我了,根本看不懂啊,忒多,各種亂七八糟的代碼段,解釋,最主要也是心急,知道這下完了,下午的時間估計要花費在這個該死的漏洞上了。。


=======================正式開始=======================


1、這是個什麼漏洞?

通過對CVE-2011-2461原理分析及案例的認真研讀和學習,我們很容易知道,這個漏洞能夠讓黑客們很容易很輕鬆的加載我們服務器上的SWF文件,僞裝成我們安全域下的沙箱文件,竊取用戶的隱私信息。(雖然並沒有什麼東西能夠竊取到,竊取直播的視頻流?好吧,即使沒什麼怕偷走的,還是修復的好!)

2、這是什麼引起的?

原因文章中也詳細分析了,是由於安全域授權時採用“導入式加載”的方式造成,我們在Adobe官方提供的API文檔中(詳見導入加載LoaderContext.securityDomain)也可以發現其具體介紹。


3、真的有這樣的漏洞麼?

是的,在SDK4.6版本中確實存在,烏雲平臺也不能瞎說呀。博主根據文章中介紹的順序仔細認真的分析過swf流程加載的順序,覈對過每個提到的代碼段,加載原理,最終在ModuleManager.as類中L463行找到如下代碼段。


就是文中最後提到的內容。

4、如何修復這個漏洞?

這個也不用咱們操心,文章中都有講,而且這漏洞還是歷史漏洞,文章中給出了四種解決辦法,如下:

對於這個漏洞,修復與防禦措施可能有如下幾點:

  • 更新開發工具

  • 對於採用老版本SDK編譯產生的swf文件,可以使用新版本的開發工具重新編譯一下,或者採用修復工具對swf進行補丁(https://helpx.adobe.com/flash-builder/kb/flex-security-issue-apsb11-25.html)。當然,如果文件已經很古老,直接暴力的刪掉就好了。

  • 將swf等存在安全風險的靜態資源文件放置到獨立的域名下,可最大程度避免此類問題。

  • 開發者在編寫相關代碼時,應該儘量避免使用“導入式加載”;在使用Loader類時,應該對加載的URL進行合法性判斷。

我們重點關注一下,提到的工具,其實是Adobe對這個漏洞的講解和修復手段。

5、Flex Security Issue APSB11-25一文中,提到了兩種解決辦法,一種臨時應急的解決方案,一種一勞永逸永久性的解決方案,當然大家都知道肯定是第二種靠譜。

官方漏洞地址工具地址,需要電腦安裝air環境

應急方案:是下載官方提供的修復工具,對存在漏洞的swf文件,修復,操作簡單快速,可行。

永久方案:更新開發者使用的SDK版本,按照文中介紹4.6以上的SDK已經修復了這個問題,可是博主用的也是4.6的SDK,但真真的有這個問題,想到還有4.13的SDK存在,於是果斷替換SDK,重新編譯,發佈,用漏洞工具檢測,結果顯示不存在漏洞,查看ModuleManager.as類發現代碼段有變化,如下:


我們還可以根據提到的命令行解析成文本的方式進行驗證,命令行切換到FB的安裝路徑,然後進入sdks/bin,執行swfdump -abc -路徑/xxx.swf > 路徑.txt,這樣就把swf二進制搞成了txt文本格式,對修復前和修復後的兩個swf文件執行上面命令,然後使用文件對比軟件Beyond compare(博主電腦很早之前安裝,很有用的軟件,其他對比軟件亦可)結果如下:


這個對比結果只有兩處不同,第一個是文件名,博主自己命名的,無關緊要,第二處就是上面的圖中,也就是說前後的對比能夠發現確確實實是通過修改的ModuleManager.as中那段代碼能夠解決問題,烏雲平臺和官網給的都是可行方案。

6、博主要說的?

博主一直很囉嗦,異想天開的我以爲自己更改4.6SDK中的ModuleManager.as可行,那可不可以呢,答案是不可以的,雖然我手動把代碼修改成功,但完全是欺騙自己啊,就自己知道更改過,FB編譯器不知道,因爲沒編譯沒運行,系統SDK需要打包重新ant纔可。

7、更改後有什麼影響?

選擇工具修復,除非以後不維護代碼,這種不安全的修正措施,萬一後期那個倒黴的程序員忘記工具修復就等着挨批吧。那是不是說換高版本的SDK就可取呢,高版本的SDK需要高版本的flash player插件支持,可能會影響用戶體驗,需要更新自身插件才能用,不過說回來,大多數用戶電腦上的FP都是新版的,目前來說是17beta版本,而SDK4.13只要求fp14.0以上就可。那爲什麼不適用SDK4.7呢或者SDK4.6A啊,博主認爲那些SDK也存在漏洞,不想每天都爲了修復漏洞浪費時間啊。


博文中應該再加幾張圖的,可是下班後還沒吃飯。。想想就算了吧,真正想看的關心的沒幾個,而且提到的兩篇文章都比較詳細,我這裏也只不過是做了介紹而已。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章