馬靜華 上海鐵路局收入稽查處
傳統的財會業務不斷向數字化方向轉變,審計對象擴展到了信息系統及系統中的數據,這些變化對審計從業人員帶來了前所未有的挑戰。如何適應新變化開展計算機環境下的審計工作成為了擺在審計人員面前一個急迫的現實問題。
審計工作的基本方式是審查和評價,即搜集證據,查明事實,對照標準,做出好壞優劣的判斷。新形勢下要提高審計水平,就要在審計手段上有所突破,在傳統查證方法的基礎上不斷擴充新的技術手段。現場審計實施系統(AO)、“審計之星”等計算機審計系統的出現,在信息系統審計數據審計方面邁出了實質性的一步。但應用程序審計作為信息系統審計的另一重要領域,由于缺乏重視、工作難度大等原因,發展比較緩慢。
近年來蓬勃發展的軟件逆向工程技術,為應用系統審計,特別是閉源應用系統的安全性審計提供了有效的技術手段,可以借鑒到信息系統審計工作中來。
信息系統審計是一個通過收集和評價審計證據,對信息系統是否能夠保護資產安全和維護數據完整、使被審計單位的目標得以有效實現和組織資源得到高效使用等方面作出判斷的過程。
自1960年代電子數據處理審計(EDP審計)出現至今,信息系統審計作為一門新興學科正日益成熟起來。廣義的信息系統審計對象涵蓋了企業中運行的供應鏈管理、生產管理、財務管理、客戶關系管理等各類信息系統。通常所說的信息系統審計是狹義的概念,仍然屬于財務審計的范疇,其重點是對財務會計管理的信息系統進行審計[1]。
按照審計對象性質的不同,信息系統審計可分為面向數據的審計和面向應用程序的審計兩類[2]。面向數據的審計是以被審計系統中的數據為中心,通過對數據的采集、轉換、整理、分析和驗證,來判斷其與既定財會勾稽關系的符合程度,并運用查詢分析、數據挖掘等多種技術構建模型進行數據分析,發現趨勢、異常和錯誤,從而收集審計證據,以達成整體審計目標。面向應用程序的審計是對信息系統及其內部控制措施以及信息系統生命周期進行的審計。應用程序審計不僅包括基礎設施,軟硬件管理,通訊網絡等與應用程序運行密切相關設備設施和管理措施,還包含應用程序的功能模塊的實現與處理規則、算法的合法性效益性、控制的執行與效率,最終達到檢查與評價各種類型信息系統的合法性、安全性、可靠性和高效性的審計目的。
目前,受各種因素影響,信息系統審計很大程度上還局限于數據審計范疇,對應用程序進行深入的查證分析面臨很多困難。
首先,應用程序審計所需的知識相對離散,除傳統的財務審計知識外,還需要很多計算機專業知識,應用程序審計實踐對操作系統原理、網絡通信原理、編程語言、軟件調試的要求相對較高。
其次,針對不同的信息系統,審計人員需采用不同的技術手段。以代碼審計為例,Winform應用程序的開發語言就有 ASM、C、C++、C#、Java等,審計時需要根據系統選用的語言和開發技術,有針對性地分析,沒有通用的分析方法。個人掌握的知識終究有限,不可能全面覆蓋分析技術,這增加了應用程序審計的困難程度。
再次,信息系統審計人員缺乏進行系統審計所需的條件。目前應用程序審計的環境還不成熟,進行審計工作還需解決很多實際的問題,最復雜的就是對閉源系統的運行邏輯分析。對系統的安全控制過程審計的比較高效的方式就是代碼審計,通過閱讀開發文檔和系統的源代碼,可以有效地找到系統中潛在的安全風險。但是,實際工作中系統源碼和開發文檔屬于軟件開發商的核心機密,幾乎不可能公開,審計人員源碼和開發文檔可能性較少,只能通過現象分析或技術手段在較低層次進行系統執行邏輯的查證。
逆向工程技術最早出現于工業領域,即根據已存在的產品,反向推出產品設計數據(包括各類設計圖或數據模型)的過程。軟件逆向工程(SoftwareReverseEngineering)由此發展而來,指從可運行的程序系統出發,運用解密、匯編、系統分析、程序理解等多種計算機技術,對軟件的結構、流程、算法、代碼等進行逆向拆解和分析,推導出軟件產品的源代碼、設計原理、結構、算法、處理過程、運行方法及相關文檔等[3]。通常,人們把對軟件進行反向分析的整個過程統稱為軟件逆向工程,把在這個過程中所采用的技術都統稱為軟件逆向工程技術。
3.2.1 信息系統審計使用軟件逆向工程技術應實現的目標
要明確逆向工程在信息系統審計中應達到的目標,首先應明確信息系統審計的職能。信息系統審計是對信息系統及其數據的真實性、安全性和績效性三方面進行分析和評價[4]。其中安全性審計是其他審計的基礎與前提,一個在安全方面存在嚴重問題和缺陷的信息系統,它提供的數據不會真實可靠。企業的許多內部控制機制已經程序化、數字化、虛擬化以后,內部控制與信息系統已經成為相互融合的一個整體,這是內部控制面臨的新問題,也是系統安全性審計的重點內容。信息系統審計工作中采用軟件逆向工程技術進行軟件分析的主要目標在于恢復軟件的數據訪問機制、用戶的身份認證機制以及權限控制機制的運作原理,并對系統及系統中數據的真實性、完整性、安全性、可靠性、保密性進行分析和評價。
3.2.2 軟件逆向工程應用到信息系統審計中應采用的主要技術
軟件逆向工程分析所使用的技術手段,一般分為靜態分析技術和動態分析技術兩種。
所謂靜態分析,即采用反匯編或反編譯等技術手段,得到對應程序的近似代碼或匯編程序清單、并在其上分析程序流程,了解軟件功能[5]。動態分析技術是一種對目標程序模擬執行并進行跟蹤調試的技術,其工具是軟件調試器程序。靜態分析是以程序為中心,動態分析是以輸入為中心。靜態分析只是通過目標系統的代碼清單來推斷系統的行為,立足于分析人員對代碼清單的理解,與輸入無關。動態分析立足于用戶輸入和與之相應的系統執行過程的分析,不同的輸入可能得到不同的分析結果。動態分析對輸入的依賴導致動態分析的不完全,但同時也將程序的輸入、輸出和程序行為緊密地聯系起來。通過動態分析可以看到程序由于輸入的變化直接引起了程序的內部行為和系統輸出的變化。不同的分析可以收集到不同的有用信息,先后執行靜態分析和動態分析比單獨地執行任一種分析更有效。因此,分析人員應將這兩種方法結合使用以達到最好的分析效果。
對一個應用軟件的逆向工程會涉及到軟件的多個模塊,由需求決定對軟件中某個或某些功能模塊進行調試。通常,一個完整的逆向工程分析過程一般應確保經過以下步驟:①通過閱讀用戶手冊、幫助信息、開發文檔等資料并結合實際運行操作,充分掌握系統的各項信息;②分析并去除軟件的保護措施;③恢復可執行程序為程序清單;④進行靜態、動態分析;⑤記錄分析過程、編寫分析文檔。
破解一個軟件通常只需對其認證保護的功能模塊進行逆向分析,簡單地說只是對應用程序做了一個局部檢查,而應用程序審計則是全身體檢,這就要求我們在眾多的檢查內容中找到最關鍵的部分進行重點檢查。每一個信息系統因其軟件架構的不同各有薄弱環節,要找到這些薄弱環節首先要弄清楚系統的架構和運行模型。所以,審計人員對各種模塊進行逆向分析,首要的任務是梳理出整個軟件的架構和系統運行模型。在此基礎之上,根據軟件架構和運行模型的特點有針對性地選擇出需要重點分析的軟件模塊,并進一步對其運行細節進行分析查證,最終達成整體審計目標。
隨著軟件逆向分析技術的不斷發展,逆向分析工具的功能越來越強大,可執行文件被反編譯或反匯編后所得到的代碼清單可讀性越好,分析工作的難度大大降低。信息系統審計人員應協助企業最大程度地做好信息系統的反調試保護,降低信息系統風險。如果采用了合適的保護機制,如對程序集庫采用了加殼處理,反編譯軟件之前就必須先進行脫殼操作,這就增加了逆向工程分析的成本。審計人員無法去除的高強度外殼程序,不法分子進行逆向分析所需要的代價和技術要求會更高。無法查明的安全隱患被封裝在軟件中,其風險程度將大大降低。
信息系統審計需要特別注意信息系統運行保護,如果對生產環境中的信息系統進行軟件逆向工程分析,有可能對信息系統造成意想不到的破壞。在目前各種系統廣泛集成和實時協作的信息系統審計環境下,一個系統的宕機有可能會對整個企業的生產經營環境造成嚴重損失。可行之舉是先通過技術手段模擬出信息系統及其運行環境,在此基礎之上再進行逆向工程分析。比如所逆向的系統可架設在VMWare虛擬機上的模擬系統,就不會對實際生產環境造成任何威脅。
信息系統審計中采用軟件逆向工程技術進行分析,會揭示出很多系統內在的、不為人知的漏洞或弱點,從系統漏洞被發現,到軟件開發商修補好漏洞的這段時間是一個真空期,這期間系統比任何時刻都更加脆弱容易受到攻擊。所以,對漏洞的細節披露需要慎重,不能過于詳細,要做到既能揭示問題,又無法輕易被不法分子利用。待系統升級后,方可公開有危險的漏洞細節。
軟件逆向工程技術一度被認為是軟件知識產權的嚴重威脅,提起逆向工程人們馬上就會聯想到軟件破解、注冊機、系統入侵等負面作用,其實,軟件逆向工程本身沒有善和惡的屬性,使用它的人最終決定了用途的正確與否。在信息系統審計中運用軟件逆向工程技術,能夠解決其他審計方法所無法解決的問題,有其特殊的用途和特有的價值。