目前Android上的流行的軟件廣泛存在着安全缺陷與安全漏洞,漏洞產生的緣由可能有不少,例如如下幾種。安全
一、Android提供了一種開放的環境,在得到了靈活性和能夠知足各類定製需求的同時,也損失了部分安全性。服務器
二、開發團隊一般將精力集中在產品設計、功能實現、用戶體驗和系統等方面,而不多考慮安全問題網絡
三、Android提供的安全機制比較複雜,開發者須要理解它們,並對攻擊思路和攻擊方法有所瞭解,纔能有效的保護軟件。ide
四、目前不多出現對特定的移動軟件安全漏洞的大規模針對性攻擊,在真實的攻擊出現以前,許多人並不重視。工具
數據存儲ui
一、將隱私數據明文保存在外部存儲,這樣並不安全。編碼
攻擊者寫的軟件能夠將其讀取出來,並傳輸到指定的服務器,形成隱私信息泄露。較好的作法是對這些數據進行加密,密碼保存在內部存儲,由系統託管或者用戶使用時輸入。加密
二、將系統數據明文保存在外部存儲,這樣並不安全。設計
惡意軟件能夠讀取它們,有可能用戶展開進一步的攻擊。接口
三、將軟件運行時依賴的數據保存在外部存儲。
若是軟件將配置文件存儲在SD卡上,而後在運行期間讀取這些配置文件,並使用其中的數據決定如何工做,也可能產生問題。攻擊者編寫的軟件能夠修改這些配置文件,從而控制這些軟件的運行。對於這種配置文件,較安全的方法是保存到內部存儲;若是必須存儲到SD卡上,則應該在每次使用以前判斷它是否被篡改,命名於預先保存的內部的文件哈希值進行比較。
四、將軟件安裝包或者二進制代碼保存在外部存儲。
如今不少軟件都推薦用戶下載並安裝其餘軟件,用戶點擊後,會從互聯網下載另外一個軟件的安裝包,保存到SD上而後安裝。也有一些軟件爲了實現功能擴展,選擇動態加載並執行二進制代碼。若是安裝或者加載前,軟件沒有對SD卡的文件進行完整性驗證,判斷其是否可能被篡改和僞造,就可能出現安全問題。所以,軟件應該在安裝或加載位於SD的任何文件以前,對其完整性作驗證,判斷其與實現保存在內部存儲中的(或從服務器下載下載的)哈希值是否一致。
五、全局可讀寫的內部文件。
若是要跨應用比較好的方法是實現各Content Provider組件,提供數據的讀寫接口併爲讀寫操做分別設置一個自定義的權限。
六、內部敏感文件被root權限軟件讀寫。
這個問題並無通用的解決方法,開發者可能須要根據實際狀況尋找方案,並在可用性與安全性之間作出恰當的選擇。
網絡通訊
Android軟件一般使用WiFi網絡與服務器進行通訊。WiFi並不是老是可靠的,例如開放的網絡或者弱加密網絡中,介入者能夠監聽網絡流量。攻擊者可能本身設置WiFi網絡進行釣魚。此外,在得到root權限後,還能夠在Android系統中監聽網絡數據。
一、不加密的明文傳輸敏感數據。
最危險的是直接使用HTTP協議登陸帳戶或交換數據,這類問題的解決方案很顯然:對敏感數據採用基於SSL/TLS的HTTPS的數據傳輸。
二、SSL通訊不檢查證書有效性。
在SSL/TLS通訊中,客戶端經過數據證書判斷服務器是否可信,並採用證書的公鑰與服務器進行加密通訊。這種作法可能致使的問題是中間人攻擊。
三、使用短信註冊帳戶或接收密碼。
有些軟件使用短信進行通訊,例如自動發送短信來註冊、用短信接收初始密碼、用短信接收用戶重置密碼等。短信並非一種安全的通訊方式,惡意軟件只要申明瞭SEND_SMS、RECEIVE_SMS和READ_SMS這些權限,就能夠經過系統提供的API向任意號碼發送任意短信、接收指定號碼發來的短信並讀取其內容,甚至攔截短信。所以,這種經過短信註冊或接收密碼的方法,可能引發假冒註冊、惡意密碼重置、密碼竊取等攻擊。此外,這種與手機號關聯的帳號還可能產生增值服務、危險更大。較好的實現方式仍是走Intent。
密碼和認證策略
一、明文存儲和編碼存儲密碼。
許多軟件有「記住密碼」的功能,若是開發者依字面含義將密碼存儲在本地,可能致使泄露。
另外,有的軟件不是直接保存密碼,而是使用Base6四、固定本身或者字符、ProtoBuf等方法對密碼存儲在本地,可是這些編碼也不會增長密碼的安全性,採用smail、dex2jar、jd-gui、IDA Pro等工具,攻擊者能夠對Android軟件進行反編譯。
較好的作法是,使用基於憑據而不是密碼的協議知足這種資源持久訪問的需求,例如OAuth等。
二、對外服務器的弱密碼或固定密碼
使用IMEI或者IMSI做爲惟一認證憑據
IMEI、IMSI是用於標識手機設備、手機卡的惟一編號。若是使用IMSI或者IMEI做爲用戶的惟一憑據、可能致使假冒用戶的攻擊。