不經一事,不長一智。

從考完NT 4.0 MCSE後,我就鮮少在Windows上下苦功,都是抱持著用到哪學到哪的精神。

今天在Windows 2008(有開UAC)上調Trixie設定時,發現設定結果無法儲存,沒彈出錯誤,但下次開IE就又回到修改前的樣子。

我知道IE7啟用了所謂的Protected Mode,在存取本機資源時設下諸多限制,以防止透過瀏覽器發動的攻擊,這問題八成與權限有關。二話不說,召來茶包一哥進行偵察,果不其然,由Log來看就是權限設定問題。Trixie的設定要寫入Trixie.config.tmp時出現了Access Denied(下圖中紅色部分)。

一般來說,利用Run As Administrator方式跑IE就可以解決問題,但不知什麼原因,我Run As Admin後無法在IE開啟Trixie設定畫面,感覺上設定畫面出現的瞬間就被關掉。於是我試了另一個方式,暫時關掉Protected Mode後,就可以順利儲存設定。(下圖後段的Log即為順利存檔時的對照)

 

在我的腦海中,存取成功與否由權限設定控制,所以我修改了C:\Program Files (x86)\Bhelpuri\目錄的NTFS權限設定,改為EveryOne均可以讀寫。開啟Protected Mode再試一次,ProcMon檢視結果還是顯示Access Denied!!

這就奇了,NTFS權限都全開了,寫檔動作為何還被擋下來? 臨時Google惡補一下,才知道自己Lag大了... 在Vista中(Windows 2008亦然)又多了新的安全防議法寶--Mandatory Integrity Level,不但檔案上可以設NTFS權限控制,又多了第二層控管,資料物件跟Process各有Integrity Level設定,系統絕對禁止卑微低下的Process去接觸高尚尊貴等級的資源,就算該Process是用管理者身份執行的也不例外。

這好比你受邀參加朋友在某間固特異米其林四星餐廳(Bhelpuri\Trixie資料夾)的Party,明明賓客名單上就有你的名字(NTFS安全設定裡已指定權限),卻因為你穿了T恤+牛仔褲+藍白拖鞋(開啟Protected Mode的IE,Integrity Level被標為Low)而被擋在門外。

在此補充另一位MVP的解說,應該就更明白了。

因此,透過Vista中新增的MIC(Mandatory Integrity Level,強制完整性控制功能),為微軟作業系統增加一道新的安全防線。
他進一步解釋,在Vista作業系統裡,包含程序(Process)和其他資源的安全物件(Securable Object)都有畫分完整性級別(Integrity Level,IL)的等級,分成不信任(Untrusted)、低(Low)、中(Medium)、高(High)及系統(System)等5個級別,級別低的程式不能修改級別高的檔案或程式碼。「而一般的使用者登入多為中權限。」邱銘彰說。
摘自: iThome online : : Vista 夠安全嗎?

而Integrity Level的設定無法由Windows檔案總管等UI查得,SysInternals工具組裡有個AccessChk可以顯示,

C:\Program Files (x86)\Bhelpuri>accesschk -d trixie

Accesschk v4.23 - Reports effective permissions for securable objects
Copyright (C) 2006-2008 Mark Russinovich
Sysinternals - www.sysinternals.com

C:\Program Files (x86)\Bhelpuri\Trixie
  Medium Mandatory Level (Default) [No-Write-Up]
  RW Everyone
  RW BUILTIN\Users
  RW NT SERVICE\TrustedInstaller
  RW NT AUTHORITY\SYSTEM
  RW BUILTIN\Administrators

是的,目錄的IL是Default(Medium),Protected Mode下的IE的IL是Low,因而存取遭拒。問題的解法不外乎: 讓IE以非保護模式執行;或開放Trixie目錄允許IL=Low的程式存取,而我打算嘗試後者。

微軟似乎沒有釋出修改IL的工具(更正: 有內建工具icacls可修改IL,見文後說明),除了Call SDK硬幹,網路上大家多用Mark Minasi(Windows技術書作家)自己寫的chml工具。

C:\Program Files (x86)\Bhelpuri>chml trixie

chml v1.011 -- Change Windows Integrity Level
by Mark Minasi (c) 2006-2008 www.minasi.com
"chml -?" for syntax, examples and notes.

trixie's Windows integrity level=unlabeled (medium)

C:\Program Files (x86)\Bhelpuri>chml trixie -i:l

chml v1.011 -- Change Windows Integrity Level
by Mark Minasi (c) 2006-2008 www.minasi.com
"chml -?" for syntax, examples and notes.

Integrity level of trixie successfully set to low.

C:\Program Files (x86)\Bhelpuri>chml trixie

chml v1.011 -- Change Windows Integrity Level
by Mark Minasi (c) 2006-2008 www.minasi.com
"chml -?" for syntax, examples and notes.

trixie's Windows integrity level=low

修改Trixie目錄IL設為為Low,再試一次,Trixie設定在Protected Mode下也可以順利儲存囉!

[2008-02-17 Update] 其實Vista/Windows已有內建的工具可以修改Integrity Level: icacls http://msdn.microsoft.com/en-us/library/bb625965.aspx,謝謝Phoenix補充。

【延伸閱讀】


Comments

# by ReDrAy

感謝你的研究心得,真的很有幫助!

# by Phoenix

Windows Vista以後的Mandatory Integrity Level如果要修改,微軟是提供一個叫做"icacls"的命令工具來修改,我通常都是下像這樣"icacls 資料夾路徑 /setintegritylevel (OI)L"這樣的命令來修改。

# by Jeffrey

to Phoenix, 原來如此,先前一直沒有查到這個指令,也狐疑為什麼Vista沒給內建的指令修改這個IL設定,謝謝您的補充。

Post a comment