葛 興,李云飛,何小虎,陰國富
(渭南師范學院 計算機學院,陜西 渭南 714099)
安卓操作系統(tǒng)最初由Andy Rubin開發(fā),2005年8月由Google收購注資。2007年11月,Google以Apache開源許可證的授權方式,發(fā)布了安卓操作系統(tǒng)的源代碼。第一部安卓智能手機T-Mobile G1發(fā)布于2008年10月。2021年6月,安卓12 Beta版正式發(fā)布。經(jīng)過10余年的發(fā)展,目前安卓操作系統(tǒng)已經(jīng)在移動平臺得到了廣泛應用,2019年市場占有率已經(jīng)達到87%。
隨著安卓應用軟件(APP,Application)的規(guī)模愈加擴大,邏輯愈加復雜,其可靠性也愈加難以保證。市場上的安卓應用軟件多有可靠性低、安全性低、程序優(yōu)化差、程序越權等缺點。在市場快速擴張的時代,客戶對軟件可靠性的需求不明確,開發(fā)者在可靠性方面投入不足,往往只注重開發(fā)速度、交付速度、程序正確性和用戶界面(UI,User Interface)的友好性等,忽略了安卓應用軟件的可靠性。開發(fā)者大量使用開源代碼和公用模塊,缺陷率普遍偏高,可被利用的已知和未知缺陷較多,軟件運行不穩(wěn)定,使用壽命短,安全性差,占用資源多,難以升級和更新?lián)Q代。有調(diào)查顯示,普通軟件公司開發(fā)的軟件缺陷(bug)密度為4~40個缺陷/千行代碼,高水平軟件公司開發(fā)的軟件缺陷密度為2~4個缺陷/千行代碼,美國NASA開發(fā)的軟件缺陷密度為0.1個缺陷/千行代碼。[1]安卓軟件作為直接提供用戶服務,與用戶交互最多的環(huán)節(jié),其可靠性對用戶體驗的影響非常大,甚至會高于安卓系統(tǒng)對用戶造成的影響。不過,安卓軟件正在逐漸從初期的“野蠻生長”慢慢走向規(guī)范化、模塊化、正規(guī)化。由于各個應用軟件之間競爭激烈,在各方均實現(xiàn)了基本功能后,哪家公司的產(chǎn)品能在可靠性、安全性上展現(xiàn)出優(yōu)勢,其產(chǎn)品就會在市場競爭中獲得消費者的青睞。政府、軍隊、大學、國防科研部門的對外采購尤其重視可靠性和安全性。國家的監(jiān)管也日趨嚴格和規(guī)范,要求企業(yè)開展數(shù)據(jù)活動必須履行數(shù)據(jù)安全保護義務、承擔社會責任。因此,安卓可靠性是今后安卓軟件開發(fā)技術的一個重要研究方向,為了提高安卓可靠性,需要從技術和管理的角度共同制定解決方案。
現(xiàn)階段安卓軟件高可靠性設計處于一個快速發(fā)展的階段。有很多高可靠性設計的“點”,例如采用某個函數(shù)、某個技術可以避免某種缺陷;也有一些高可靠性設計的“線”,例如在需求分析中考慮到高可靠性需求,但整個高可靠性設計并沒有一個從頭到尾、從需求分析到運行維護、從技術到管理皆包含的“面”。本文的目標是,分析研究高可靠性設計一個個孤立的技術點,歸納總結高可靠性設計的多種技術路線,最終提出完整的高可靠性軟件開發(fā)模型,形成一個“面”。這是一個技術和管理相融合的軟件工程模型,真正將高可靠性設計融入安卓軟件開發(fā)中的每一步與每一個細節(jié),注重軟件可靠性設計,強調(diào)量化風險控制,更加科學、專業(yè)和規(guī)范。
LYVAS等[2]討論了安卓劫持攻擊,該類攻擊會對用戶的數(shù)據(jù)機密性產(chǎn)生很大威脅,提出了一種操作系統(tǒng)級防御機制,該機制會監(jiān)控安卓應用程序活動時訪問的資源,并在其內(nèi)置數(shù)字簽名,以對用戶和開發(fā)人員透明。MERL等[3]討論了安卓應用程序重新打包的問題。通過重新打包,攻擊者可以誘使移動用戶安裝重新打包的(可能是惡意的)應用程序,用以替換原始應用程序。HAMDI等[4]研究了移動應用程序開發(fā)中重構對代碼異味(code smell)的影響,通過分析5個開源 Android 應用程序的652個版本和9 600次重構操作,發(fā)現(xiàn)一般的重構并不能有效地消除代碼異味。WANG等[5]使用機器學習算法檢測安卓惡意軟件,使用了一個多維、基于內(nèi)核特征的框架和基于特征權重的檢測方法,旨在對安卓惡意軟件和良性應用程序的特征進行分類和理解。GARG等[6]提出了一個全面而合理的分類法來回顧安卓安全中使用的最先進方法。強調(diào)了不同分析方法的趨勢和模式,確定了目標、分析方法的關鍵技術、代碼表示、使用工具和框架,并展望了未來工作的研究領域。GAVIRIA DE LA PUERTA等[7]創(chuàng)建了一種方法來分析任何類型的移動應用程序發(fā)送的網(wǎng)絡數(shù)據(jù)包,以驗證其行為。為了解決這個問題,使用監(jiān)督學習系統(tǒng)對網(wǎng)絡數(shù)據(jù)包的通信模式進行建模。DA COSTA等[8]探索使用靜態(tài)分析和動態(tài)分析來提高挖掘沙箱法(mine sandboxes)識別安卓惡意軟件的性能。FRANKE等[9]提出了一種移動軟件質量模型(Mobile Software Quality Model),該模型主要從軟件的兼容性(Flexibility)、可擴展性(Extensibility)、適應性(Adaptability)、便攜性(Portability)、可用性(Usability)和運行效率(Efficiency)來考察移動軟件的質量。LI等[10]基于軟件功能模塊重用可靠性分析,提出了一種新的軟件可靠性早期預測方法。該方法將不同模塊的重用分為不同的權重,并基于權重進行加權分析。SUN等[11]使用復雜網(wǎng)絡理論(complex network theory)研究了安卓操作系統(tǒng)內(nèi)核與功能組件之間的交互關系,通過將操作系統(tǒng)建模為復雜網(wǎng)絡來研究安卓操作系統(tǒng)內(nèi)核的交互問題。STAVROU[12]闡述了安卓編程技術以及如何高效安全地實現(xiàn)安卓編程。RUBINOV等[13]討論了安卓應用程序測試中動態(tài)實例組件仍然被現(xiàn)有技術所忽視。何鳳軍等[14]將軟件可靠性設計分為軟件體系架構設計、冗余設計、健壯性設計、容錯設計、避錯設計、錯誤恢復設計及重用設計等。馬振宇等[15]圍繞測試運行方式以及驗證指標類型對軟件可靠性驗證測試方法的基本原理進行分析,歸納總結出各驗證測試方法的適用特點。王金勇等[16]對開源軟件可靠性模型參數(shù)估計、可靠性和評測標準進行了論述。張威[17]分析了軟件可靠性評估的現(xiàn)狀和問題,并介紹了極值統(tǒng)計模型、基于BootStrap重抽樣技術的軟件可靠性模型和基于故障注入技術和加速壽命試驗原理的軟件可靠性評估模型。劉洋等[18]提出了以系統(tǒng)危險為基礎的軟件安全性與可靠性分析策略,并結合實例對這一策略的實際應用進行了深入探討。閆永權等[19]梳理了軟件老化問題并進行了軟件抗衰研究。
在軟件安全設計領域,主要采用4種模型進行軟件安全設計,第一種是微軟的軟件安全開發(fā)生命周期模型(Security Development Lifecycle,SDL)[20],第二種是MCGRAW GRAY提出的軟件內(nèi)建安全開發(fā)模型[21],第三種是NIST的軟件內(nèi)建安全開發(fā)模型[22],第四種是OWASP的軟件安全開發(fā)模型[23]。
長期以來,軟件可靠性(Software Reliability)作為衡量軟件的重要特性受到特別重視。GB/T 11457—2006《信息技術 軟件工程術語》將軟件可靠性定義為:(1)在規(guī)定條件下,在規(guī)定的時間內(nèi)軟件不引起系統(tǒng)失效的概率。該概率是系統(tǒng)輸入和系統(tǒng)使用的函數(shù),也是軟件中存在缺陷的函數(shù)。系統(tǒng)輸入將確定是否會遇到已存在的缺陷(如果缺陷存在的話)。(2)在規(guī)定的時間周期內(nèi)所述條件下程序執(zhí)行所要求的功能的能力。[24]
軟件可靠性最重要的度量指標有3個,分別為軟件可靠度、軟件失效強度和軟件平均失效時間。[17]
(1)軟件可靠度。軟件可靠度是指,軟件在特定條件下,在時間t內(nèi)不間斷完成某設定功能的概率。用變量t表示發(fā)生失效的時刻,f(t)為失效概率密度函數(shù),F(xiàn)(t)為分布函數(shù),R(t)為可靠度函數(shù),P(0≤t≤T)表示從開始時刻到T時刻軟件發(fā)生失效的概率,則有
(1)
(2)
(2)軟件失效強度。軟件失效強度是指,已工作到時刻t但尚未失效的軟件,在時刻t后發(fā)生失效的概率,記作λ(t)。失效強度函數(shù)與失效概率密度函數(shù)、可靠度函數(shù)之間的關系為
(3)
(3)軟件平均失效時間(Mean Time to Failure,MTTF)。設N0個不可恢復的系統(tǒng)在同樣的條件下進行試驗,測得其全部失效時間為t1,t2,…,tN0,其MTTF為
(4)
當N0趨向于無窮時,MTTF為系統(tǒng)失效時間的數(shù)學期望,則有
(5)
安卓軟件存在風險有其必然性,首先,計算機系統(tǒng)的結構決定了軟件漏洞是不可避免的。其次,軟件趨向大型化,第三方擴展增多,軟件使用面臨更多威脅。再次,新技術、新應用產(chǎn)生之初缺乏可靠性、安全性考慮。最后,現(xiàn)階段對開發(fā)者軟件可靠性重視不夠,軟件開發(fā)者不具備實現(xiàn)可靠性的知識和能力。
安卓軟件可靠性設計的一般原則可分為業(yè)務功能的可靠性設計、數(shù)據(jù)源的可靠性設計和占用資源的可靠性設計。業(yè)務功能的可靠性設計包括:合理分配執(zhí)行任務;設計任務同步與并發(fā);任務負載的均衡,多個業(yè)務執(zhí)行流有序執(zhí)行;生命周期的閉合;良好的用戶交互和提示。數(shù)據(jù)源的可靠性設計包括:核心的數(shù)據(jù)和文件應有備份和容錯設計;外部輸入數(shù)據(jù)的合法性判斷;向外發(fā)起的服務請求,要有超時和有限重試設計;對外部發(fā)起的攻擊性請求,例如通知、廣播,要有防護設計。占用資源的可靠性設計包括:分配的資源必須在確定的地方釋放;使用資源必須有明確的上界,包括內(nèi)存、磁盤、文件、線程等。
在整個安卓軟件開發(fā)流程中,漏洞是會積累和傳遞的,軟件運維過程中出現(xiàn)的一些“先天性問題”就是這種漏洞積累和傳遞的體現(xiàn),所以在設計之初就要盡量把漏洞消除在前期階段。軟件產(chǎn)生漏洞的方式可以歸納為兩種:一是程序代碼引入漏洞,二是開發(fā)過程引入漏洞。程序代碼具有長度、算法和語句結構等特性,程序的代碼越長,數(shù)據(jù)結構越復雜,函數(shù)越多,可靠性越難保證。
微軟推出的安全開發(fā)生命周期(SDL)是一套針對軟件開發(fā)過程進行安全保障的方案,旨在盡量減少設計、代碼和文檔中安全相關漏洞的數(shù)量。微軟的實踐證明,從需求分析階段就開始考慮安全問題,可以大大減少軟件產(chǎn)品漏洞的數(shù)量,雖然會在一定程度上增加成本,但整體上能夠提高它的性價比。[25]
安卓軟件工程受限于嚴格的成本控制和有限的開發(fā)時間,往往需要在可用性、經(jīng)濟性、時效性、可靠性等性能之間做出一定的取舍,而可靠性經(jīng)常是被犧牲的,主要有以下兩個方面的原因:(1)安卓軟件編程人員沒有經(jīng)過專門的可靠性開發(fā)培訓,缺乏可靠性編程意識和能力。(2)在現(xiàn)有的安卓軟件產(chǎn)品開發(fā)中,通常在開發(fā)流程后期才進行測試,以消除編碼中的錯誤或缺陷。這種方式對于減少軟件產(chǎn)品中的漏洞數(shù)量有一定的作用,但對于用戶需求、系統(tǒng)架構上存在的缺陷和錯誤是無能為力的,而這些前期需求和設計階段的缺陷往往會大幅度增加軟件發(fā)布后的維護成本,給開發(fā)商和用戶都帶來巨大風險。
因此,為了提高安卓軟件的可靠性,應將安卓可靠性的思想融入安卓軟件瀑布開發(fā)法中的每一步中,即為了開發(fā)高可靠的安卓軟件,把可靠性加固活動融入安卓軟件生命周期的各個階段中去。
軟件瀑布開發(fā)法是最典型的軟件開發(fā)方法,也稱為線性模型,結合瀑布開發(fā)法和SDL開發(fā)流程,再融入高可靠性開發(fā)的思維,最終形成了本文的安卓軟件高可靠性開發(fā)模型。共分為7個階段,每個階段都有其對應的高可靠性活動,如圖1所示。
圖1 基于SDL的安卓軟件高可靠性開發(fā)模型
在安卓軟件開發(fā)的初始階段,應針對團隊成員進行高可靠性意識和能力培訓,使之了解基礎知識和最新趨勢,提升團隊能力,保障軟件開發(fā),讓管理者、設計者、開發(fā)者、測試者、運維者從始至終將“高可靠”貫穿在整個開發(fā)周期之中,所有人都有較強的可靠性觀念。基本培訓應涵蓋的基礎內(nèi)容包括:(1)高可靠性設計培訓。其主題為減少攻擊面、縱深防御、最小權限原則和默認安全配置。(2)威脅建模培訓。其主題為威脅建模概述、威脅建模的設計意義和基于威脅建模的編碼約束。(3)高可靠性編碼培訓。其主題為緩沖區(qū)溢出、整數(shù)溢出、SQL注入等漏洞。(4)弱加密安全測試培訓。其主題為高可靠性測試與功能測試的區(qū)別、風險評估和測試方法。(5)隱私保護培訓。其主題為隱私敏感數(shù)據(jù)的類型、隱私設計最佳實踐、風險評估、隱私開發(fā)最佳實踐和隱私測試最佳實踐。(6)高級概念培訓。其主題為高級安全設計和體系結構、可信用戶界面設計、安全漏洞細節(jié)以及威脅緩解。
除了對開發(fā)團隊進行培訓以外,還要對管理進行改進。管理者應當認識到,在未來的軟件市場競爭中,對員工進行高可靠性培訓,對軟件進行高可靠性設計,在前期雖然投入了更多成本,但最終會是“利大于弊”的。高可靠性并非僅僅錦上添花的附加賣點,而是和業(yè)務功能密不可分的基礎要求。因此,管理者要提供足夠的時間和資源來保證高可靠性培訓的貫徹落實。
在高可靠性需求分析階段,開發(fā)團隊確定安卓軟件的相關標準和要求,建立可靠、安全和隱私的最低采用標準。開發(fā)團隊通過判斷缺陷等級來設定可靠性的最低采用標準。在項目開始時定義這些標準可加強對可靠性問題相關風險的理解,并有助于團隊在開發(fā)過程中發(fā)現(xiàn)和修復可靠性缺陷。項目團隊必須協(xié)商確定每個開發(fā)階段的質量門(例如,必須在嵌入代碼之前審查并修復所有的編譯器警告),隨后將質量門交由可靠性顧問審批,可靠性顧問可以根據(jù)需要添加特定于項目的說明及更加嚴格的可靠性要求。
軟件高可靠性分析的目的是描述為了實現(xiàn)信息安全目標,軟件系統(tǒng)應該做什么才能有效地提高軟件產(chǎn)品的可靠性,減少軟件可靠性漏洞。一個缺少高可靠性需求分析的軟件開發(fā)項目,將威脅到信息的保密性、完整性和可用性以及一些其他重要的安全屬性。
軟件的可靠性需求主要分為外部可靠性需求和內(nèi)部可靠性需求。外部可靠性需求通常是指法律、法規(guī)等遵從性要求,包括國家和地區(qū)相關技術與管理的法規(guī)、標準及要求等。這些法律法規(guī)往往是已有可靠性威脅的經(jīng)驗性對策總結,因而遵循這些要求既是法規(guī)制度上的要求,也是軟件可靠性保障的要求。內(nèi)部可靠性需求通常包括兩個方面:一是開發(fā)團隊內(nèi)部的政策、標準、指南和實踐模式,二是與軟件業(yè)務功能相關的可靠性需求。
軟件業(yè)務功能相關的可靠性需求獲取的相關方包括業(yè)務負責人、最終用戶、客戶、可靠性需求分析人員和安全技術支持等。業(yè)務負責人、最終用戶和客戶在安全需求確定時應發(fā)揮重要作用,應當積極參與安全需求的采集和分析過程。業(yè)務負責人是業(yè)務風險的最終責任人,負責確定可接受的風險閾值,明確哪些風險是可以接受的,因此他們應當了解軟件的可靠性漏洞,協(xié)助可靠性需求分析人員和軟件開發(fā)團隊考慮風險的優(yōu)先順序,權衡決定哪些風險是重要的。可靠性需求分析人員要負責軟件可靠性需求的收集和分析,并幫助軟件開發(fā)團隊將安全需求轉化為功能說明。為了保證可靠性需求活動的有效展開,相關方面人員必須進行充分的溝通與合作,特別是在相關方是非技術人員的情況下。一些常見的可靠性需求獲取方法包括頭腦風暴、問卷調(diào)查和訪談、策略分解、數(shù)據(jù)分析、主/客體關系矩陣、使用用例和濫用用例建模,以及軟件可靠性需求跟蹤矩陣。
在高可靠性設計階段,從可靠性和安全性的角度定義軟件的總體結構。通過分析攻擊面,設計相應的功能和策略,降低并減少不必要的安全風險,同時通過威脅建模,分析軟件或系統(tǒng)安全威脅,提出緩解措施。在進行高可靠性設計時,應當遵循8條設計原則,如圖2所示。
圖2 高可靠性設計的8條原則
軟件受攻擊面原則是指用戶、程序或潛在的攻擊者都能夠訪問到的所有功能和代碼的總和,它是一個混合體,不僅包括代碼、接口和服務,也包括對所有用戶提供服務的協(xié)議,尤其是那些未被驗證的或遠程用戶都可以訪問到的協(xié)議。一個軟件的攻擊面越大,其可靠性風險就越大。減少軟件受攻擊面就是移除、禁止一切不需要使用的模塊、協(xié)議和服務,其目的是減少攻擊者可以利用的漏洞。
最小權限原則是指系統(tǒng)僅授予主體(用戶、管理員、進程等)完成規(guī)定任務所必需的最小權限,并且該權限的持續(xù)時間也剛好夠用。最小權限原則可使惡意的或過失的特權不正當使用的可能性降到最低,從而確保系統(tǒng)安全。如果沒有很高的權限,那么很多程序是無法實現(xiàn)其破壞功能的。不僅要防止程序被攻擊,還要盡可能地防止程序被攻擊之后的后續(xù)破壞行為的實施,將損失盡可能降到最低。
縱深防御原則是指在軟件設計中加入層次化的安全控制和風險防御方案??v深防御原則有助于減少系統(tǒng)的單一失效點。它強調(diào)不依賴單一的高可靠性解決方案,而是采用多種互相保障的可靠性功能,即使一個點失效,也不會導致整個系統(tǒng)崩潰??v深防御原則還可以威懾試探性的攻擊者,當他們遇到一層又一層的阻滯時,可能會知難而退,放棄攻擊。
默認高可靠配置原則是指為系統(tǒng)提供默認的高可靠性措施,包括默認權限、默認策略等,盡可能讓用戶不需要額外配置就可以安全地使用。默認高可靠配置原則也是保持系統(tǒng)簡單化的重要方式。
保護最弱一環(huán)原則是指保護系統(tǒng)中最弱的組件。類似于“木桶原理”,攻擊者通常會嘗試攻擊系統(tǒng)中最薄弱的環(huán)節(jié),這些薄弱的環(huán)節(jié)可能是代碼、服務、接口,甚至是人,比如使用社會工程學技巧攻擊管理員。
可靠性性價比原則是指以合適的開發(fā)成本生產(chǎn)具有較高可靠性的軟件產(chǎn)品??煽啃孕詢r比原則并不是要求壓縮在可靠性上的投入。因為高可靠性設計并不是業(yè)務功能之外的華而不實的功能,而是業(yè)務功能之內(nèi)的系統(tǒng)基本保障。微軟SDL實踐也表明,軟件安全開發(fā)方法并不會增加成本,相反因為減少了用戶的損失和后期的運行維護費用而降低了總成本。
可靠性心理可接受原則是指可靠性機制要設置得簡單、易用,盡可能讓可靠性機制對用戶“透明”,不給用戶使用帶來不便和麻煩,用戶才會認同和使用高可靠機制。
完全控制原則是指要求每一次訪問受保護對象的行為都應當盡可能地進行細粒度的檢查。
在高可靠性實施階段,按照設計要求,對軟件進行編碼和集成,實現(xiàn)相應的安全功能、策略及緩解措施。在該階段通過安全編碼和禁用不安全的API,可以減少編程時導致的安全問題和由編碼引入的安全漏洞,并通過靜態(tài)代碼分析等措施來確保安全編碼規(guī)范的實施。具體措施有:(1)使用統(tǒng)一標準的開發(fā)工具——所有開發(fā)者只能使用統(tǒng)一標準的開發(fā)工具及其關聯(lián)的安全檢查表,如編譯器、鏈接器的警告。此列表應由團隊的可靠性顧問進行批準。一般情況下,開發(fā)者應盡量使用穩(wěn)定版本的開發(fā)工具,使用開發(fā)工具的安全分析功能和保護措施。(2)放棄使用不可靠的函數(shù)——一些編程中常用的函數(shù)與API(應用編程接口)并不可靠。開發(fā)者應當分析安卓軟件編碼過程中使用的所有函數(shù)和API,對函數(shù)和API進行可靠性識別,禁用不可靠的函數(shù)和API,并使用最新最可靠的函數(shù)和API作為替代。(3)靜態(tài)代碼分析——開發(fā)者應對源代碼執(zhí)行靜態(tài)分析。靜態(tài)代碼分析本身通常不足以替代人工代碼分析,開發(fā)者應了解靜態(tài)分析工具的工作模式、優(yōu)點和缺點,并輔以人工代碼分析,平衡工作效率和代碼覆蓋率。
在高可靠性驗證階段,通過動態(tài)分析和測試手段,檢測軟件的安全漏洞,全面核查攻擊面,檢查各個關鍵因素上的威脅緩解措施是否得以正確實現(xiàn)。(1)動態(tài)程序分析。此驗證任務采用動態(tài)分析工具,監(jiān)控應用安卓軟件在運行時是否存在內(nèi)存泄漏、程序越權等可靠性問題。(2)模糊測試。模糊測試是一種專門形式的動態(tài)分析,它通過故意向應用程序引入不良格式或隨機數(shù)據(jù)而誘發(fā)程序故障。模糊測試策略的制定以應用程序的預期用途、功能和設計規(guī)范為基礎??煽啃灶檰柨梢砸筮M行額外的模糊測試,或擴大模糊測試的范圍并增加持續(xù)時間。(3)威脅模型和攻擊面評析。實際完成的安卓應用程序可能會與軟件開發(fā)項目需求階段和設計階段所設定的功能和結構不完全一致。因此,在高可靠性實施后,分析軟件的攻擊面評估,對軟件進行威脅模型演練評估是非常有必要的。威脅建模的一般流程如圖3所示。
圖3 威脅建模過程
一般的高可靠性驗證框架為:(1)制定高可靠性驗證策略。明確軟件驗證的目標、范圍、標準、風險控制要素、驗證資源、成本與效益、驗證人員、驗證時間,制定軟件高可靠性驗證基本原則,特別是對于第三方驗證,明確驗證的約束條件、知道驗證的邊界是非常重要的。驗證策略也可以用于驗證軟件產(chǎn)品的可接受程度。(2)規(guī)范化的高可靠性需求。軟件可靠性需求是驗證的主要內(nèi)容,通過分析驗證對象的可靠性特點,生成測試用例。(3)軟件結構風險分析。在成本約束下,將驗證適當聚焦于可靠性領域問題。(4)執(zhí)行軟件可靠性驗證。使用黑盒測試、白盒測試等方法,對軟件可靠性功能進行驗證。(5)環(huán)境管理。設置穩(wěn)定、可控的驗證環(huán)境,保證每一個被提交的漏洞都能準確重現(xiàn)。如果是在用戶環(huán)境下進行滲透測試,那么在滲透測試結束之后需要對現(xiàn)場進行復原,保證系統(tǒng)恢復測試前的狀態(tài)。(6)驗證數(shù)據(jù)管理。軟件可靠性測試用例、驗證結果和驗證報告等都需要進行電子歸檔,以保證測試能夠有效地幫助發(fā)現(xiàn)軟件存在的可靠性問題,并不斷改進。
在高可靠性發(fā)布階段,對軟件進行最終可靠性核查。該階段將每個開發(fā)階段的文件、過程和數(shù)據(jù)都進行歸檔,準備進行發(fā)布與維護。這些文件、過程和數(shù)據(jù)包括所有的法律法規(guī)、行業(yè)標準、軟件需求文檔、概要設計文檔、詳細設計文檔、軟件源代碼、注釋、二進制文件、專用符號等。
在安卓軟件發(fā)布之前,最后一件事是進行最終可靠性核查。最終可靠性核查是指在即將發(fā)布前全面檢查軟件的所有可靠性功能。最終可靠性核查由專業(yè)的可靠性顧問在開發(fā)人員的協(xié)助下執(zhí)行,這并不是“查找與修補”的活動,而是對需求和設計階段提出的可靠性需求進行最終檢查。最終可靠性核查有3種結果:一是通過,這證明所有的可靠性需求和設計都已經(jīng)被正常實現(xiàn);二是通過但有異常,這證明主要的可靠性需求和設計都已經(jīng)被正常實現(xiàn),但仍有部分可靠性需求和設計并未被正確實現(xiàn),不過這種問題可以在后續(xù)版本更新中盡快修復;三是未通過,即軟件的關鍵可靠性需求和設計未被實現(xiàn)且難以在短時間內(nèi)修復,這種狀況下軟件不能被批準,不能按時發(fā)布。軟件必須返工重修,或上報高級管理層進行抉擇。
在高可靠性響應階段,響應安全事件與漏洞報告,實施漏洞修復和應急響應。同時發(fā)現(xiàn)新的問題與安全問題模式,并將它們用于安卓軟件可靠性的持續(xù)改進中。即使在發(fā)布時軟件不包含任何已知的漏洞,也并不意味著軟件就絕對安全可靠,仍會面臨日后出現(xiàn)的新威脅。
高可靠性響應計劃應包括以下方面:(1)組建專業(yè)的運維團隊。如果開發(fā)團隊太小以至于沒有專門的運維團隊,那么也應制定緊急運維團隊預案,開發(fā)者、市場營銷、管理人員應充當緊急運維團隊成員。(2)對于不同類型的事件,要做好分類和分級,確保響應及時有效,能夠處理緊急事件。(3)做好軟件的回滾、重新部署、增量更新等預案。(4)做好如何處理第三方代碼的預案。
為了驗證本文所提出的安卓軟件高可靠開發(fā)模型,設計對照實驗,由兩組學生分別使用安卓軟件瀑布開發(fā)模型和本文提出的安卓軟件高可靠性開發(fā)模型,分別開發(fā)同一個安卓項目——手機安全衛(wèi)士。開發(fā)參考資料為《Android項目實戰(zhàn)——手機安全衛(wèi)士》[26]。開發(fā)小組1使用典型的安卓軟件瀑布開發(fā)模型,項目命名為MPSG_FALL。開發(fā)小組2使用安卓軟件高可靠開發(fā)模型,項目命名為MPSG_HRD。
開發(fā)小組2,按照安卓軟件高可靠開發(fā)模型的流程,即按照高可靠性培訓、高可靠性需求分析、高可靠性設計、高可靠性實施、高可靠性驗證、高可靠性發(fā)布、高可靠性響應的流程進行開發(fā)。
3.1.1 高可靠性培訓
在進行MPSG_HRD開發(fā)之前,先對參與開發(fā)的所有人員進行培訓。首先將本文提出的安卓軟件高可靠開發(fā)模型講授給開發(fā)人員,讓開發(fā)人員從始至終將“高可靠”思想貫穿在整個開發(fā)周期之中。
用2周時間,共計20個課時對開發(fā)小組2進行培訓,培訓內(nèi)容為高可靠性設計培訓、威脅建模培訓、高可靠性編碼培訓、弱加密安全測試培訓、隱私保護培訓、高級概念培訓。
3.1.2 高可靠性需求分析
隨著安卓系統(tǒng)的普及,用戶需要保護自己的隱私、知曉自己的手機流量的詳細使用情況以及如何攔截騷擾電話,以便在享受手機帶來的方便的同時盡可能減少損失。
為了解決手機的安全隱患,設計開發(fā)一款手機安全衛(wèi)士軟件,該軟件可以管理手機中安裝的軟件、保護用戶隱私、攔截騷擾電話、清理垃圾、查殺病毒、監(jiān)控流量與網(wǎng)速等。便捷的操作、友好的用戶體驗以及極強的實用性是手機安全衛(wèi)士軟件必備的。極高的可靠性和手機安全衛(wèi)士本身的安全性更是需求中的重中之重。軟件應符合GB/T 18336—2015標準,必須在嵌入代碼之前審查并修復所有的編譯器警告(0 error,0 warning)。
3.1.3 高可靠性設計
MPSG_HRD主要設計有7大功能,分別為手機清理、騷擾攔截、病毒查殺、軟件管理、程序鎖、網(wǎng)速測試、流量監(jiān)控。具體功能模塊設計如圖4所示。
圖4 MPSG_HRD功能模塊設計
手機清理模塊包含掃描垃圾和清理垃圾功能。騷擾攔截模塊包含騷擾攔截列表、黑名單列表和聯(lián)系人列表功能。病毒查殺模塊主要實現(xiàn)病毒查殺信息顯示與病毒查殺進度顯示功能。軟件管理模塊的功能是對手機中的各類軟件進行啟動、卸載、設置權限。程序鎖模塊的目的是設置密碼和輸入密碼進行解鎖。網(wǎng)速測試模塊用來測試上傳和下載文件的網(wǎng)速以及顯示測試報告界面。流量監(jiān)控模塊包括流量監(jiān)控信息、套餐流量設置和本月流量詳細報告功能。
3.1.4 高可靠性實施
MPSG_HRD開發(fā)時間為4周,JDK版本為8.0,開發(fā)環(huán)境和調(diào)試環(huán)境分別為Android Studio 3.2和Android 8.0操作系統(tǒng)榮耀手機,使用SQLite數(shù)據(jù)庫,API版本為27,使用基于Java的Android語言實現(xiàn)程序編碼。MPSG_HRD代碼結構如圖5所示,其中HomeAdapter.java是主界面的布局填充器,用于填充界面中的所有功能圖標與文字信息。VersionEntity.java是封裝版本信息的實體類,主要包含字段versioncode、description、apkurl。DownLoadUtils.java是用于從服務器下載APK的工具類。MyUtils.java用于獲取應用程序的版本信息,并實現(xiàn)新版本APK的安裝。VersionUpdateUtils.java是用于進行版本更新的工具類。SplashActivity.java用于展示歡迎界面以及版本信息。HomeActivity.java用于展示程序主界面以及實現(xiàn)各個功能圖標的點擊事件。
圖5 MPSG_HRD代碼結構
3.1.5 高可靠性驗證
高可靠性驗證主要針對保密性、完整性、可用性、可認證性、可審計性進行驗證。驗證流程為:先完成每個單元模塊的測試,再進行集成功能測試。對于保密性,主要檢查數(shù)據(jù)驗證算法和數(shù)據(jù)加密函數(shù)。對于完整性,主要檢查數(shù)據(jù)完整性和系統(tǒng)完整性。對于可用性,主要檢查手機安全衛(wèi)士的有效性、效率和用戶滿意度。對于可認證性,主要檢查用戶賬戶的命名規(guī)范、密鑰的儲存和認證憑證的管理。對于可審計性,則聚焦于軟件性能監(jiān)控、事件監(jiān)控和日志分析。
經(jīng)過測試,發(fā)現(xiàn)并修改如下錯誤:(1)MPSG_HRD在應用進程退出時,高頻率注冊時長1 s的定時器,定時器到時立即啟動該應用及關聯(lián)應用。如果系統(tǒng)反復清理該應用,該應用會反復自啟動,導致操作系統(tǒng)嚴重卡頓。(2)由于編程錯誤,MPSG_HRD反復注冊了數(shù)百個應用管理權限管理的AppOps Listener,在執(zhí)行callback的時候直接導致system_server進程global reference table overflow,即溢出錯誤,造成系統(tǒng)錯誤重啟。(3)MPSG_HRD收到消息通知之前,需要獲取通話狀態(tài)。如果短時間內(nèi)收到通知消息特別多,會將system_server的binder線程全部占滿,致使其他應用和服務無法與system_server通信,導致系統(tǒng)重啟。(4)兼容性問題,如果使用更高版本的Android操作系統(tǒng),那么MPSG_HRD會頻繁閃退,無法使用。
3.1.6 高可靠性發(fā)布
最終發(fā)布前,對MPSG_HRD的所有需求分析文檔、設計文檔、軟件代碼、測試用例、Bug集合、中間代碼等所有項目相關的文件和數(shù)據(jù)都進行集中歸檔,并進行代碼混淆、項目打包、項目加固。進行最終可靠性核查,所有的可靠性需求和設計都已經(jīng)被正常實現(xiàn),通過核查。將MPSG_HRD發(fā)布到手機應用市場,如小米應用商店、華為應用商店、360應用商店等,通過審核后,MPSG_HRD就可在應用商店供用戶下載使用。發(fā)布的MPSG_HRD 軟件界面如圖6所示。
3.1.7 高可靠性響應
組建運維團隊,制定應急響應預案,項目主持人、指導教師、參與的學生均為緊急運維團隊成員。應急響應預案流程如圖7所示。
圖7 應急響應預案流程圖
當系統(tǒng)發(fā)生故障后,運維人員立即響應,并向相關人員了解系統(tǒng)故障情況。接下來,運維人員根據(jù)了解到的系統(tǒng)故障情況進行分析,判定是軟件故障還是硬件故障,以確定采用哪種處理方式。如果是軟件故障,則通過查看系統(tǒng)日志、應用日志等方式找出軟件出錯原因;如果是硬件故障,則通過硬件錯誤信息提示找出錯誤原因。之后由運維人員根據(jù)現(xiàn)場的實際情況,在與用戶協(xié)調(diào)后,進行故障解決。故障解決后,運維人員需要書寫詳細的故障報告歸檔總結,以不斷迭代提高運維水平。
使用安卓軟件高可靠性開發(fā)模型與安卓軟件瀑布開發(fā)模型開發(fā)相同的手機安全衛(wèi)士項目,分別命名為MPSG_HRD和MPSG_FALL,其性能參數(shù)對比如表1所示。
表1 MPSG_HRD與MPSG_FALL性能參數(shù)對比
經(jīng)過實驗測試對比,MPSG_HRD在可靠性、缺陷/千行代碼、平均失效時間等參數(shù)性能上顯著優(yōu)于MPSG_FALL。
MPSG_HRD通過了模糊測試和滲透測試,而MPSG_FALL則未通過。雖然所占用內(nèi)存稍大、所消耗電量稍高,但幾乎不存在內(nèi)容泄露問題,不會出現(xiàn)安卓軟件長時間使用后出現(xiàn)的卡頓和死機問題。另外,MPSG_HRD在服務器端進行了二級容災備份,并且有專門的應急響應預案,當數(shù)據(jù)信息由于各種原因丟失時,MPSG_HRD可以快速啟動應急響應,恢復數(shù)據(jù)信息。綜上所述,MPSG_HRD在綜合性能,特別是可靠性上明顯優(yōu)于MPSG_FALL,驗證了基于SDL的安卓軟件高可靠性開發(fā)模型的有效性。
本文分析了當前安卓軟件可靠性的背景、研究現(xiàn)狀和相關工作,研究了軟件可靠性度量指標、影響因素和常見的可靠性故障及其原因分析,論證了安卓軟件可靠性的重要性、緊迫性和經(jīng)濟性。之后,基于微軟SDL軟件安全開發(fā)生命周期模型提出了一種新型高可靠安卓軟件開發(fā)模型,該模型的核心思想是將“高可靠性”設計思想融入安卓軟件設計開發(fā)的每一個步驟中,在安卓軟件設計的7個步驟——培訓、分析、設計、實施、驗證、發(fā)布、響應中,均融入高可靠性思想,從技術、管理和經(jīng)濟等多個方面對模型進行了說明和論證,為安卓軟件可靠開發(fā)提出了一個具備可行性的全過程開發(fā)模型。該模型需要在可靠性方向投入較多資源,因此更適合于有著充足資源的大型企業(yè)和大型軟件開發(fā)團隊,其可靠性收益可以顯著超過可靠性成本。對于大型企業(yè)和大型軟件開發(fā)團隊有較好的推廣應用價值。該高可靠性軟件開發(fā)模型也對其他強調(diào)可靠性、安全性的高可靠性軟件開發(fā)模型有一定的借鑒和參考意義。
在未來,應針對開發(fā)周期短、資金投入少、開發(fā)者技術相對較低的小微企業(yè)和小微軟件開發(fā)團隊,設計性價比高、可行性高的安卓高可靠性軟件開發(fā)模型。進一步研究軟件高可靠性設計和軟件高可靠性實施,提高模型的實用性和經(jīng)濟性。同時,助力高校和企業(yè)科研項目,讓高可靠性軟件開發(fā)模型在安卓軟件開發(fā)中得到切實應用與實踐反饋,不斷地修改和完善。