James Forshaw:大家下午好,我是James Forshaw。我們的部門主要是看一些微軟和蘋果的項目,我所做的工作就是Windows平臺,比如說基礎問題、系統問題。我們今天的討論是和大家分享我們的一些研究,有一些有意思的漏洞。
我所說的是記錄,記錄可能并不是非常有意思的一個話題,但是我做了一些研究,我把這個微軟的記錄作為我的研究中心,作為深階的記錄,比如一些潛在的功能,這個可能是對Chrome的瀏覽器是非常重要的,比如所做的一些事情怎么使瀏覽器系統更加安全。
我們看到潛在的或者是隱藏的安全的事情,比如可以有API,可以有Windows,看看最后的功能。我們也要找漏洞,非常有意思的是我們找到不一樣的漏洞,有一個解釋的方式。
記錄有一個問題是寫數據,并不是所有的API都容納下來,必須有一些有限的真正的這么一些數據可以放在我們的記錄里,太長了開發者就可能不會來讀,所以另一個問題就是Windows在演變,一直被增加和被更新,這樣就給我們帶來一個問題,有的記錄并不是更新的,可能不是現有的時間寫的記錄。
還有一個記錄并不是表現的現實,并不是來解釋API的功能,所以有的時候有一些內容是丟失了,或者我們沒有放進去,這個實際上會影響我們的能力,比如說我們在看這個的能力,比如說在寫這個安全密碼的時候可能會影響我們的能力。有的時候可能并不是非常準確,而且也不能非常完美的詳細的執行。
整個系統的工作流程怎么樣在執行過程當中充分發揮功效?我們做這樣的事情是基于以下的原因,因為我們要在不同的平臺上有不同的密碼,所以我們想,我們的一些應用,我們打開一個文件,最后有一個開放的系統,可以在這個體系之下打開一個文檔。
但這只是一個例子,我們有兩個參數和兩個限制,實際上打開的需要三個參數,所以我們要把這兩個功能進行對接,我們要翻譯這些參數,這樣的話,能夠讓其很好的執行。很多情況下我們可以有這樣的路徑,這是一個典型的POSIX的應用。
Windows在這一方面有了新的舉措,首先在Win32 API的復雜性,有簡單的系統,必須建立開放文件的API,我們可以看到這個路徑,其他的東西必須要從這個參數中來引出,這個實際上更增加了復雜性。
但是這個系統的呼叫可以變得更加差勁,比如在Windows,在這個概況之下,我們有的時候不能來保證這個路徑能夠進入這個文件,因為這個內容是不一樣的,所以我們必須來進行改變,我們必須改變文件的參數。
Windows有不同的API的層面,但是我們只是要想一下比較重要的,一個就是最上面的一個應用,比如說內核,Windows API大家比較熟悉了。我們再深挖一下,到核,比如說有一些空的ADL,他們有不同的功效。
為什么我們要有這樣的研究呢?因為我們發現了有意思的一個項目,是Bug Bounty的這么一個項目,我們把它設為IE是1,因為有些逃離,這是漏洞。這些漏洞實際上可以讓你有登錄的鑰匙,這樣的話,可以非常容易挖掘。
但是這個漏洞很有意思,實際上是一個固定的東西,要阻礙這個有意義的形象方面的鏈接。我們會看到在不同的層面上路過,也就是意味著,我想不受形象上的攻擊,我想保護這方面,使我的系統不受攻擊,我們必須從零開始。
必須是零,必須是記載,我們看MSDN實際上被記錄了,是像大家期待的那樣,是開放的,象征性的這么一個數據鏈接。還有一些相關的文件,實際上同樣的參數,但是它的反應并不一樣。
比如說我們開放的鑰匙的通入,所以這個就告訴了我們在執行的過程中,如果支持這個方面,有這個安全功能的話,實際上沒有被記錄,這個記錄并不是一貫的,即使它是有相似的功能。
當然,到現在差不多是三年之前,我在想我們怎么樣最后能夠利用這個來找到功效或者是找到漏洞,我就說我在找不同的參數之前需要API的記錄,所以我們就有MSDN,我們可以上網來下載MSDN,可以下載文件。
有這個技術方面文件的記錄,還有微軟通過的一個方式,還有三方的一個文件,比如Windows,還有外方的一些技術,可以幫助你執行一些建議,比如說Windows API,就可以更加深入的了解系統的漏洞。
如果你有這些了,你就有源泉的密碼了。這個通常是Windows給你的,所以可能是向外走的時候得到這些信息。這些有可能會泄漏到真實的世界中,你們可以使用。
我需要把這些文件記錄,然后引出我們的研究,比如說線上和線下的。很明顯,我可以使用Bing,你可以在美國用谷歌,用Bing引擎。如果是微軟的產品,實際上有的時候可能并不是很容易的搜到,
你還有其他的一些引擎的選擇,然后可以回到我們的記錄,確實能夠幫助我,這個沒有問題,我需要有一種方式,能夠找到一些功能。這樣的話,我可以找到我們的文件和記錄,然后來做我的分析。
所以我想起了DLL進口的這些圖書館,很多的這些內容實際上沒有很多的口令,他們只是一個圖書館。如果你建立這個文件,你找你內部的一些項目來吸入,來進入,然后做你的項目。
這個就是一個有記錄的樣子,我把這個內容輸入進去,最后有這么一些結果,這個結果理論上講,實際上通過開發者來引進這個項目,引進這個圖書館的內容,這是基礎的東西。這里差不多給我介紹了27000種功效,這么長的功效的名字,我們需要很長的時間來進行過濾,來把這些我需要的功能調出來。
也就是說,有Windows API的功效,我要把它過濾出來。
我想我不需要這些名字,我可以在SDN的線上來搜索,在搜索引擎上找到。但是我并不建議大家這樣做,因為在此你可以看到非常小的文件,一個API是100KB,這個實際上有的時候不是很有實效,用的時候不是非常的實際,
有的時候可能不是你想要的,這里面包括了其他的內容可能不是你要的。但是還有一個線下的SDN,并不光是線上的。線下實際上有很多鎖住的文件,這個實際上非常簡單。現在就有問題了,我們沒有目錄,但是目錄里邊也有很多雜的內容,
每一個文件的頭部都會說,比如說你可以選擇,可以找到API的文件,這個可以讓我使用這些信息來建立我的目錄。然后我得到的這個結果,差不多有8千多個功能,是2萬個功能之內做出來的,所以已經小多了。
現在我有我的這個文件了,非常接近我的這個簡單的數據了。但是這些文字,XHTML的文件我需要來搜索。那么怎么做呢?XHTML的文件把節點放進去,搜索關鍵詞。在此我認為,微軟實際上在控制我,因為每一個文件都有保留的APL的提醒,還有自己的權限,知識產權,我并不想被這個來阻礙。
所以我把這個文件找出來,然后會有一些后端的這么一個非常好解構的信息,我可以找到這個信息,然后有參數可以進入。
我看不同的一些點和元素,是不是這個參數為未來保留和預留了,還有價值是不是被保留了,然后放到零,使用了還是沒使用,這些都是我的參數后選的列。這個已經比2萬的功能少很多了,我還需要一個原代碼,這個語言是為了能夠找到你的功效是不是正確的,
比如說這個參數必須包括一個節點的這么一個內容,怒容能夠告訴你這是對的,你可以通過這個緩沖區,而且可以做出這樣的決定,這就是一個安全方面的漏洞。在這些不同的情景,這些沒有記錄的密碼,我們把它找出來,然后把它預留,作為預留的參數,微軟用這些注釋,所以這些注釋實際上是一些普遍的參數,源代碼,實際上意味著不同的功效。
為什么說這個很有意思呢?如果你想嘗試一下,其實它是挺有意思的。我們可以通過這樣的參數,比如說驗證它是零,但是我們這是一個值,我們通過計算認為可能是一些Bug,我們就進行了一些修改。
通過這樣一些靜態分析的工具,我們就發現其實它只是對Call這一方來發起了一個警告。因為這個參數被存儲了,所以說這個分析器并沒有覺得你應該有任何的函數產生。比如說有600多個函數,如果有100個函數,我們發現它并沒有被存儲,就成為了一個很大的Flag。
但是我很喜歡自己動手去做這些事情,我們找出這樣的一些函數,600個函數還是太多了,所以我就想去限制一下。
用一種系統的方法,我們就可以去看這個核心的函數,大概最后精簡到90個函數,所以說通過這種精簡你們可以去運算。至少我需要看一下有哪些參數是已經被存儲下來的,我們就看這些文檔有哪些信息的信息,然后我們把這些函數進行解析,看看它到底代表著一種什么樣的情況,到底是否被使用了沒有。
因為這些參數可能會給我們指出一些有可能有興趣的一些函數,我們再重新看這些文檔,看看有沒有一些安全的保證或者是假設,怎么很好的看這些函數輔助的信息。我們有三種類型的代碼,這是用一些角色表示的,大概有一半左右,基本上都是忽略了這樣一個參數,他覺得根本就不關心。
因為我就覺得他已經都被存儲了,就沒必要去關注,這是一個結果的豐富。
我們知道,他們看到了這些函數很有意思的一種行為,我們就把這些參數拿出來,我們把它用于一個文檔訪問的限制條件。
它是很有意思的,但是最后的結果就是他并沒有使用,我們要看是不是他的訪問被簽署了。如果說你只是打開這個文檔,他是不可能再創建一個新的文檔。不管你用的是什么代碼,你就不可能實際的去做任何的運行,因為確實沒有這樣一種方便的方式。
還有另外一個就是說,這個函數因為它想要和一個文檔發生連接的話就必須要進行寫入。但是這個內核發現這個函數跟這個文件沒有這樣的連接,所以說我們在研究里面也發現了這樣的行為。還有另外一種內核,在里面就記錄了,他們把這些參數用于文檔的記錄。
第一個我覺得很有意思,就是創建了一種邊界的描述符,他并沒有直接的說他是0,他只是把他保存下來了。最后他是用這樣的Flag去設計一個邊界描述符。這個是跟私人命名空間相關的,在Windows里面,你可以對很多內核的文件命名,我們還可以跟不同的流程進行分享。
但是也有一個問題,當你出現了這種文件名沖突的話,比如說不同的文檔最后都是同樣一個名的話,他可能就會說你這個是沒辦法運行的,或者說你應該重命名。因為他們是在同樣一個位置去分享這樣的空間的,所以說我們需要分割這個資源,也允許你可以在不同的流程里面去使用這個文件名。
邊界描述符的使用就是說,這個Caller必須是在這個邊界描述符之內的,有可能是所有的東西,也沒有一些特別安全的文檔,我覺得這是一種比較通用的描述,但是還是要在這個邊界描述符的范圍之內。
比如說之前的文本,他們發現在Windows里面有一個用戶名,也有一些安全的屬性,后面我們看到了非Windows描述符,后面可以用于很多的應用。可能是在一個核里面發生或者怎樣,我們不太清楚,我們發現這種邊界描述符也是進行訪問和檢查。
比如他想訪問某一個文件,我們要去看是否能夠通過這個邊界描述符的驗證。比如說有一個格式可以看到被利用,有邊界里面條目的數目,有名稱。這里面有一個題目,只是一個名字,
并沒有什么其他的描述符,而且也是把所有的資源,像Windows等等,使用這樣的一些資源。其實是給當前的這些使用者,作為的這些應用者。這里面有兩個事情,如果他是惡意的使用這個系統的話,他可以重新設定這樣一個描述符。
還有就是所有這些應用都可能會打開一個Edge的私人命名,其實這里面有一些應用,你可以有一些命名的空間,并不能說你就是完全的可以去使用它來進行一些訪問控制,而且它會影響到所有這些應用的打包。
在文檔里面,你用這個邊界描述符,還有其他的一些描述符到底有沒有存在。在理論上你可以在任何的應用里面找到,但是在實際的操作過程當中還是要去驗證。我們播放一下這個短片,在這里面我們有Edge的一個例子,我們在這里面有一個描述符,我們可以打開這個邊界描述符,確保所有的人都能夠在同樣的情況下去打開它。
我們看到,其實它的訪問控制是非常弱的,這里面有所有應用的打包,其實這是很糟糕的,因為在同樣一個系統里面,基本上他們都是可以去拿到這些信息的,可以看到它里面的資源。這里面需要創建一些命名空間,去繼承這些名稱。然后我們看不同的應用者,可以把這個先播一下,讓大家看一下。
很明顯的,這個理想的狀態,使用者的Edge有可能是來自用戶的,用戶在這里面不會有Crash這樣的一些問題出現。我們看一下用戶,就可以打開其中一個資源,看它是不是能夠直接的接入這些資源。我們可以看到,從他們思想的某些概念里面繼承過來的這樣一種想法,這個就是我們剛才介紹了的。
Reg Load App Key,你必須是管理員,必須具有重新裝系統的權限才能獲得App Key。它其實也是一種保存參數,這個也沒有問題。但是在這里面,這個參數是沒有用的。另外我們再看一下這個文檔,我們這個文檔其實我們要看一下到底有哪些安全保障可以給我們去展示。
如果說我們能夠做所有去做的事情,用這樣的功能,那我為什么要用一些高級的?第一點你只能去加載到一個注冊樹里面某一個具體的位置,就像一個機器一樣,你用這個注冊樹,他們把它叫做軟件的,會安裝到某一個位置,沒有辦法隨意的進行加載。
還有另外一點,就是說沒有辦法去消除現有的這些Hive。我們可以去測試和驗證這樣的文檔,是不是告訴了我們一個真正的真實情況,而是說事實上還是跨越過了這些受影響的區域。他們做的方法,就是在一些沒有典型的受影響的位置,在這里面,基本上業協有一些特別沒有辦法用數字來定義的文件。
這樣也好,我們可以把一些條目等等,這些特殊的Hive來進行處理。把這個應用放在這個默認的內置的系統里面,我們需要去驗證,比如說這個是真實的,但是我沒辦法去驗證它是不是真正的Slash A,也有可能是B或者是C等等。
到這個Hive中,我想給大家介紹一個世紀的系統使用的情況。是不是能夠復制這個情景呢?可能是不允許的,或者是非法的,但是可以這樣做嗎?即使我知道我們打不開這個隨意的文件,但是我知道這個是實際的,是應該能打開的,但是沒有任何語言可以打開,這是有意義的。
如果我可以打開這個,實際上就可以打開更多的東西。但是在注冊方面可能就會困難,這個可以找到一個根基,有這個路徑可以打開。所以如果最開始的這個注冊可以通過這個設施來打開A路徑,這是有效的。這樣的話,我可以把這個擴展,然后打開其他的路徑。
實際上我們有上載和下載,可以建立這個Hive。在下載的過程中,實際上這個系統可以給你更新一個新的Hive。每個人都可以有權限進入這個Hive,可能是有限的一組人,但是實際上你有直接進入的權限。所以一個應用需要這么一個設施,這個Hive被暴露了,那么我們可以進行修改。
所以我就想回到這個記錄文檔,可能我們有一個選擇是有價值的,是不是我要專門的打開這個Hive,可不可以其他人打開和我分享呢?當我把這個路徑和大家展示的時候,會有一些在某個器件的水平到這個內核的水平,可能會有特別的一個器件,可以下載上傳參數,可能有了這個只能讀的一個器件。
我看到有一個可以打開這個注冊的鑰匙,這個實際上沒有被完全的暴露,但是如果是本地的API的話,你可以打開,所以我要看不同的地方,看看怎么樣使用。比如說如果你只是讀,可能就不用進行交易。
如果有毀壞的話,你可以進行過渡,可以把這個注冊的Hive來進行重啟。這個可能是不需要了,如果你不能讀這個Hive,實際上你不需要打開這個交易的解碼。但是如果你要寫怎么辦呢?不會給你打開一個新的文件,如果你只是一個讀的話。
我為什么要打開這個文件呢?要使我們做的事情更有意義,所以最開始的這些函數的鏈,這里有函數的核心,首先是要打開這個注冊的Hive,然后是讀,在這個位置讀。如果失敗了,如果你的路徑被否認了,被拒絕了,那么你就可以知道現在的這個過程結果了。
所以我們要打開這個注冊的Hive,作為一個用戶或者是服務的客戶,如果被拒絕了,你就可以進入這個本地的系統然后求助。如果這些服務是代表這個用戶提供的,那么應該是以用戶的ID身份來進行的。
我們打開一個本地的系統,如果只是打開一個只讀的,你要想寫的話還要再繼續找。如果有這么一個文件,他們可能會忘記以前這個只讀的路徑。所以我們做這個服務的時候,只是打開這些只讀的Hive,有的時候可能會到一些用戶的Hive,所以我們可以扔掉一些象征性的。
我們怎么樣更好的使用這些服務?怎么樣使用這些服務生效?當我們建立一個矩陣的系統應用的話,會有.COM,如果你在開發.COM的時候確實是一個痛苦的經歷。不管怎么說,一個矩陣的應用你是有一個目標的,我們使用這個系統的注冊Hive,是在使用者的范圍框架之內。
比如說我可以有一個矩陣的框架,我來破解這些密碼,在我的文檔之內來打開我的文件。如果我要進入的要求被拒絕了,比如說核心已經忘記了這只是只讀的,那么實際上也有可能有機會進行寫,也可以通過這個工具。
在注冊Hive方面給大家一些展示,在這方面我們做這種可列舉的,首先打開注冊,然后作為這個根基的鍵,然后打開A,打開其他的鍵。我希望能夠得到準入,這個就是我這么多隨意得到的一些結果,非常明顯,我們的這個Hive實際上是可以得到注冊的。
我們可以進行修改這個Edge,這個是向大家展示我們的一些技巧。比如說上傳到我們本地的Hive,然后進行運作,看起來很成功,也有失敗的時候,我們可以看到我們建立了一個新的文件,這實際上是一個默認的控制,所有的應用有這個器件的準入。
如果我有F的這個文件,我們有ABC已經建立了。最后我要做的就是進入我的本地系統,這個就是我們注冊Hive是本地的系統。我們可以獲得不同的信息進行運作,然后進入本地的系統。
最后做一下總結,我想這個文件的記錄實際上是一個非常好的方式來找漏洞。但是可以看到這個函數怎么樣運作,有的時候可以在我們的研究或者調查過程當中使用。我們做的這個研究,比如說一些安全的語言,我們是不是可以使用這些,然后來認證這些注釋的東西,是不是適合我。
如果這個開發者不這樣做的話,那么就不會被人們注意這些事情。所以我可以這樣做,還有可能有很多其他的一些文件的記錄可以進行分析,比如說這么一個文件,怎么樣能夠更新,怎么樣改變人們的行為,怎么樣給大家一些理解,實際上它也是隨著時間來變化的。
最后最大的一個結論那就是API的文件記錄,它介紹了整個的情景,不能百分之百的來確保。另一方面,它可以給一些借口,可能有的時候會有一些錯誤的理解,所以不管你讀什么,不要完全的相信。
以上就是我的分享,如果大家有什么問題的話,我會在這個會場歡迎大家來提問,希望大家能夠在下午的講座中有更多的收獲。