[Fortify]Critical: Insecure SSL: Server Identity Verification Disabled(驗證憑證)

在.NET程式透過WebRequest來建立HTTPS或FTPS連線時,有時攻城獅可能因為無法確認憑證有效性,寫了不理會憑證是否有效的程式碼來讓程式正常運作,上線前,送到源碼檢測健康檢查時,就會被列出來*標示Critical的風險,來還技術債吧。

建立HTTPS或FTPS連線時

--HTTPS
HttpWebRequest WebRequest =  (HttpWebRequest) System.Net.WebRequest.Create("https://www.MyHomeWebSite.com");
--FTPS
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://192.168.1.1:21/FileFolder");

 

加上這句

System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

又或者是

System.Net.ServicePointManager.ServerCertificateValidationCallback =
    delegate (Object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
    {
        return true;
    };

總之就是只想回傳true,但完全沒驗證,留下了技術債。

 


Insecure SSL: Server Identity Verification Disabled

好!如果這樣寫,交付客戶程式碼時,fortify會回報 Critical等級的Insecure SSL: Server Identity Verification Disabled的issue。

 


解決方式

修改的方式只要加上檢核,不管檢核的好或不好,像是檢核憑證發行者issuer不可以是鋼鐵人(誤,應該是東尼・史塔克)、效期、Subject是否包含domain網址等等..

ServicePointManager.ServerCertificateValidationCallback = CertificateCheck;
private static bool CertificateCheck(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    …
    return !certificate.Issuer.Equals("Iron Man");
}

 

重新送進來掃描,又是向critical issue說聲再見的時候了!(揮手,舞台下降..)

 


小結

  • 如果網路環境是internet或是vpn連線上來的,還是應該適當的驗證憑證,確保憑證有效性!
  • 不過,內網環境(intranet)若能啟用secure 連線的web、ftp site更佳。
  • 每個專案的CI應該要加上客戶指定的源碼檢測檢查(廠牌,Rulepack,l,filter)。

 

西班牙小組賽第一場,碰上皇馬羅老闆,手心手背都是肉,只好踢和了,羅老闆上演hat-trick。

 


參考

Insecure SSL: Server Identity Verification Disabled

https://vulncat.fortify.com/zh-tw/detail?id=desc.controlflow.java.insecure_ssl_server_identity_verification_disabled#C%23%2FVB.NET%2FASP.NET