對於硬編碼密碼,Immunity公司威脅情報負責人曾表示,這項常見的開發者漏洞不僅廣泛存在,而且在短時間內似乎也不太可能被徹底解決。早在2016年Fortinet防火牆發現硬編碼后門,盡管該公司否認硬編碼密碼是后門,稱這個漏洞是一個管理身份認證問題,但還是非常可疑。倘若攻擊者利用此漏洞,可以直接獲取Fortigate最高管理權限,控制設備進行如抓取流量監聽、DNS欺騙、建立隧道進入企業內網等攻擊行為。
一、什么是使用硬編碼的密碼?
軟件包含一個硬編碼的密碼,該密碼用於自己的入站身份驗證或與外部組件的出站通信。
這種處理方式一方面不易於程序維護,在代碼投入使用后,除非對軟件進行修補,否則無法修改密碼。另一方面會削弱系統安全性,硬編碼密碼意味着擁有代碼權限的人都可以查看到密碼,可以使用密碼訪問一些不具有權限的系統,更嚴重的是如果攻擊者能夠訪問應用程序的字節碼,利用一些反編譯工具就能閱讀到代碼,可以輕易獲得密碼。
二、使用硬編碼的密碼漏洞的構成條件有哪些?
程序中采用硬編碼方式處理密碼。
三、使用硬編碼的密碼漏洞會造成哪些后果?
如果使用硬編碼的密碼,攻擊者將很可能通過該帳戶獲得訪問權限。由於硬編碼密碼允許我們無需用戶名或者驗證實現設備登錄,因此其往往會帶來多種潛在使用途徑,甚至會泄漏部分敏感信息。
四、使用硬編碼的密碼漏洞的防范和修補方法有哪些?
對於入站身份驗證:對密碼應用強單向散列,並將這些散列存儲在具有適當訪問控制的配置文件或數據庫中。
對於出站身份驗證:將密碼存儲在代碼之外的一個經過嚴格保護的、加密的配置文件或數據庫中,該配置文件或數據庫不會被所有外部人員訪問,包括同一系統上的其他本地用戶。
五、使用硬編碼的密碼漏洞的防范和修補方法有哪些?
以下代碼使用硬編碼的密碼連接到數據庫:
public static void main(String[] args)
{
CreateDB db = new CreateDB();
Connection connection = null;
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
}
catch (Exception e)
{
System.out.println("Failed to load DB driver");
e.printStackTrace();
}
try
{
connection = DriverManager
.getConnection("jdbc:odbc:;DRIVER=Microsoft Access Driver (*.mdb);DBQ=c:/webgoat.mdb;PWD=webgoat","webgoat", "webgoat");
db.makeDB(connection);
}
catch (Exception e)
{
System.out.println("Driver Manager failed!");e.printStackTrace();
}
……
使用Wukong軟件代碼安全檢測修復系統檢測上述程序代碼,則可以發現代碼中存在着“使用硬編碼的密碼”的安全漏洞。請見下圖:
使用硬編碼的密碼在CWE中被編號為:CWE-259:Use of Hard-coded Password