PowerShell安全問題探究

強大的腳本也許會造成安全隱患,雖然PowerShell是在微軟發起“可信賴計算計劃”之後開發的一款產品,其產品的誕生必須有一名資深軟件安全專家,參與到產品設計會議,代碼複審等工作中。其雖然可以保證默認情況下是安全的,但是修改一些默認值,可以方便一些功能使用,但是難免會帶來一些安全性問題。

PowerShell能實現的操作,圖形化界面有的也可以實現,有的圖形化界面沒有相關屬性的設置,但是PowerShell可有設置呀;不管在哪裏設置,都是在已擁有的權限主體下處理對象,即使用PowerShel不會完成當前擁有的權限之外的操作。

PowerShell不會阻止惡意軟件的操作,比如系統上存在惡意軟件,它使用PowerShell做一些你權限範圍內的惡意命令,這時候PowerShell並不會阻止惡意軟件的操作,但這造成的後果不應歸咎於PowerShell,PowerShell並不能充當殺毒軟軟件來保護系統,這應該是殺毒軟件該做的事。

安全設置之一:

設置執行策略,,執行策略是管理PowerShell執行腳本的一種計算機範圍的設置選項;用戶防止用戶被注入,從來執行一些非法腳本。

默認設置是Restricted,即不允許任何腳本運行;

使用如下命令查看當前策略:

PS C:\Users\Administrator> Get-ExecutionPolicy
RemoteSigned

運行Set-ExecutionPolicy命令,設置相應策略,有如下幾種設置:

Restricted:默認設置,即除微軟提供的一部分配置PowerShell的默認腳本(帶有微軟的數字簽名)外,不允許執行其他任何腳本;

AllSigned:經過CA設計的數字證書籤名後的任意腳本,均可執行;

RemoteSigned:PowerShell可運行本地任何腳本,同時也可執行受信任的CA簽發的數字證書籤名之後的遠程腳本,“遠程腳本”即存在於遠程計算機上的腳本,通過通用命名規則(UNC)方式訪問的這些腳本。某些Windows中會區別網絡路徑和UNC路徑,這時,本地網絡中的UNC並不會認爲是“遠程”。IE,火狐和Outlook中下載的腳本,均視爲來自網絡的腳本;

Unrestricted:可運行所有腳本;

Bypass:該設置主要針對應用程序開發人員,他們會將PowerShell嵌入到他們的應用程序之中。僅在主機應用程序提供了自身的腳本安全層時才使用該選項,其會忽略已經配置好的執行策略。

 

也可以在組策略中設置執行策略,也可以使用PowerShell.exe的-ExecutionPolicy參數來覆蓋該設定=這樣的目的在於防止了不知情的用戶無意中運行一些匿名腳本。

事實上,一些惡意的軟件開發者可以更容易直接的訪問.Net Framework的函數,而不是費力去使用PowerShell工具或時其他方式;即是若有未經授權的用戶有了你計算機的管理員權限執行任意代碼,你已經在劫難逃了。

微軟強力建議我們執行腳本時使用RemoteSigned策略,並且只在需要運行腳本的機器上採用該策略,其他計算機繼續保持默認的Restricted策略。微軟解釋爲該策略保持了安全性和功能的較好平衡。AllSigned更嚴格,要求所有腳本都需要被數字簽名;

注:執行哪個策略較優的問題上,存在大量的意見,多個專家包括微軟的一些開發人員認爲,使用UNrestricted作爲執行策略,他們認爲該功能並滅有提供一個安全層,並且也不應該相信該設置可將任何危險的行爲隔離開。

安全設置之二:

是數字代碼簽名,是將一個密碼簽名應用到一個文本文件的過程。

簽名中包含兩部分重要信息,一是列出了對腳本簽名的公司或組織;二是包含了對腳本的加密副本,並且PowerShell可以解密該副本。

在創建數字簽名前,得有一個代碼簽名的證書,稱爲第三方證書。均由商業CA簽發,比如Cybertrust,GoDabby,Thawte,VeriSign等公司。可能的話,也可以從公司內部的公鑰基礎設施(PKI)中獲取到該證書。正常情況是該證書只簽發給公司或者組織,不會發給個人,在公司內部是可以簽發給個人的。

如有人使用一個證書對惡意腳本進行簽名,那麼你可以通過該證書去查找該腳本的作者-這也就是爲什麼已簽名的腳本相對於未簽名的腳本更加值得“信任”。但是若你信任一個無法很好驗證身份的CA,那麼一個惡意腳本的作者可能會獲取一個虛假的證書,這樣你就無法使用該CA的證書去做追蹤。這就是爲什麼選擇一個受信任的CA如此重要。

一旦你獲取了一個三級證書(指需要一個包裝爲帶有驗證碼的證書-通常CA會針對不同的OS以及不同的編程語言提供不同的證書),就可以將該證書安裝在本地計算機。安裝之後,可使用Set-AuthenticodeSignature Cmdlet將該數字簽名應用到一段腳本。可用Help About_Signing命令查看更多的信息。

許多商業的腳本開發環境,例如PowerShell Studio,PowerShell Plus以及PowerGUI等都可進行簽名,甚至可以在你保存一段腳本時進行自動簽名,這樣使得簽名過程更加透明。

簽名不僅能提供腳本作者的身份信息,也會確保作者對腳本簽名之後,不會被他人更改。原理如下:

1,腳本作者持有一個數字證書,該密鑰包含兩個密鑰,一個公鑰,一個私鑰;

2,當對腳本進行簽名時,該簽名會使用私鑰加密。私鑰金額能被腳本開發者訪問,同時僅有公鑰能夠對該腳本解密。在簽名中會包含腳本的副本。

3,當PowerShell運行該腳本時,會使用作者的公鑰(包含在簽名中)解密該簽名。如果解密失敗,則說明簽名被篡改,那麼腳本就無法被運行。若簽名中的腳本副本與明文副本不符,那麼該簽名就會被識別爲破壞,該腳本也無法被運行。

安全設置之三:2種默認設置

1,Windows不會將PS1文件擴展名視爲可執行文件類型,雙擊PS1文件,默認會使用記事本打開進行編輯,而不會被執行。該配置會保證即使執行策略允許執行該腳本,也不會在不知曉的情況下雙擊執行;

2,在Shell中不能通過鍵入腳本名執行該腳本。必須通過絕對路徑或相對路徑來運行腳本,比如C盤下的test.ps1絕對路徑 C:\test,相對路徑:.\test.ps1 

第二個設置會防止一些“命令劫持”類型的攻擊,在該攻擊中,攻擊者會在一個文件夾中放置腳本,命名爲一些內置的命令名,比如notepad,如果你在該路徑下運行了.\notepad,你就被攻擊了。但是我們一般會直接執行notepad 而不會加上絕對路徑,這就很大程度上防止了命令劫持攻擊。

寫在最後:

如果你將執行策略設置成AllSigned,使用商業CA提供的代碼簽名證書,是需要多繳費的,好幾千塊呢。

這時候你可以找內部的PKI提供的免費證書,也可以自己製作證書。運行Help About_Signing可查詢如何獲取和使用MakeCert.exe,該工具可用於製作一個本地計算機信任的證書。高版本的PowerShell也可以使用New-SelfSignedCertificate Cmdlet來做同樣的工作。該工具會自動在每次保存腳本時對腳本進行簽名。

不要修改一些設置使得雙擊Ps1文件就運行了腳本,這樣不安全,另外別人的腳本以及從網上下載的腳本,要看明白了再運行。。。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章