Skip to main content

 

這張照片顯示,Apple對安全引導固件組件漏洞給予最高回報。

 

這是關於什麼?

安全ROM也稱為bootrom,是CPU為了初始化而運行的第一個程式。在可信的環境中,可以驗證它加載的下一個階段的簽名,以檢查其完整性。
在iPhone,Secure ROM加載iBoot並檢查其簽名。它只會在簽名有效的情況下運行。iBoot會加載內核並檢查它的簽名,內核會加載應用程序並檢查它們的簽名。
如果您可以在內核中找到漏洞並繞過應用程序簽名,則會發生越獄,直到Apple修復內核(iOS)。如果您可以在iBoot中找到漏洞並繞過內核簽名檢查,你可以加載你想要的任何內核,然後加載你想要的任何應用程序,直到Apple修復iBoot。
如果在llb中發現漏洞,則可以加載所需的任何iBoot,直到Apple修復llb。
如果你在SecureROM中發現了一個漏洞,你可以加載你想要的任何llb,這會加載你想要的任何iBoot,這會讓你加載任何你想要的內核,並且無法修正
這是因為bootrom引導程序是主控IC本身的一部分,它不能被修復或修改。
神奇小子 Geohot發現的bootloader 等級漏洞  limera1n  就是這樣,可以加載任何你想要的llb,這會加載你想要的任何iBoot,這將允許你加載你想要的任何內核.

本文轉翻譯自
http://ramtin-amin.fr/#nvmedma

如何進行 ?

吸毒強姦的麥咖啡在新聞上瞎掰如何提取iphone flash. 

對iphone硬件做線路分析!

iPhone上的PCIe

自iPhone 6後,蘋果已經在其SoC上引入了PCIe匯流排。如另一篇關於NVMe的文章所述,iPhone可以在NVMe設備上啟動。
那些NVMe Storage沒有RAM,需要主機RAM才能工作。他們必須實現這一目標的唯一方法就是在匯流排上做DMA Master。

如何界面?

正如之前所示,一旦通過JTAG連接到NVMe就可能啟動DMA傳輸,將其轉換為BFH模式並修改其內存以使其轉儲到主機的內存。下一步將是在iPhone上工作並轉儲一些內存區域。問題是,我們需要控制其一些引腳,以避免重置或者將其切換到我們想要的模式。為了做到這一點,我們需要走得更遠。為了訪問PCIe,我的第一個嘗試是創建一個“T形”電路板,它可以連接引腳所在的位置。這將允許我進一步將NVMe芯片和JTAG芯片集成在一起。

如前所述,Serial訊號必須要有抗干擾。因此使用簡短的SATA電線連接的原因。該設置由幾個部分組成。一方面,我們有一個T型電路板,它有一個小型適配器,與被移除的NVMe芯片周圍的電容和電阻處於同一水平。

 

另一方面,我們需要為NVMe供電,給它定時鐘,並且有一個插座以連接它。

如前所示,整個設置看起來像這樣。


現在可以通過JTAG控制NVMe,同時連接到手機。

夾具適配器

問題在於,每當T板被拆焊時,它就會打破手機,最終價格非常昂貴。然後,我決定設計一個JIG,以便通過彈簧針直接連接到PCIe

現在可以安全地訪問電路板的PCIe引腳,而不會破壞任何東西。

FPGA做的仿真 PCI-E 與訊號sniffer

為了發送仲裁TLP,需要能夠控制PCIe核心。例如,在這里和那裡都有使用usb3380的解決方案,但是這些解決方案將實現2個連續的橋接,這不是我們想要的。我們希望完全能夠模擬NVMe,以便讓手機在我們的控制寄存器中設置DMA位。

該電路板的工作原理如下:我們有一個支持ARTIX 7 PCIe的FPGA,連接到用於USB 3.0的FT601Q FTDI芯片。它具有DDR3內存

你需要一名軟件工程師!

 

該板給我們直接控制所有TLP的可能性。事實上,在FTDI上,我們創建了一些虛擬頻道。一個用於設置PCIe核心配置並控制其狀態,一個用於發送/接收TLP。一個用於中斷線。被選中的設計是運行一個守護進程,負責USB 3.0事務並與FPGA進行複用。它為我們提供了3個UDP端口,用於發送/接收每個服務的數據包。由於數據包是RAW格式,我們可以完全控制我們發送的內容。這裡的目標是將內核配置為Apple NVMe芯片。具有完全相同的參數。所以iPhone邏輯板為我們設置了一點。然後可以(用一些技巧)以書面形式做一些DMA

最後的結果是這樣的。

 

對於那些想知道PCIe如何工作的人來說,這裡有一個很好的教程http://xillybus.com/tutorials/pci-express-tlp-pcie-primer-tutorial-guide-1

 

為了簡化這些複雜的事情,下面是一個用Python編寫的頭域的例子

 
tlp_request_header_fields = {
    "fmt":          HeaderField(0*4, 29,  2),
    "type":         HeaderField(0*4, 24,  5),
    "tc":           HeaderField(0*4, 20,  3),
    "td":           HeaderField(0*4, 15,  1),
    "ep":           HeaderField(0*4, 14,  1),
    "attr":         HeaderField(0*4, 12,  2),
    "length":       HeaderField(0*4,  0, 10),
    "requester_id": HeaderField(1*4, 16, 16),
    "tag":          HeaderField(1*4,  8,  8),
    "last_be":      HeaderField(1*4,  4,  4),
    "first_be":     HeaderField(1*4,  0,  4),
    "address":      HeaderField(2*4,  2, 30),
}

為了發送TLP,我們將使用read函數以這種方式填充它

 
def read(self, address):
        # send rd32
        rd = RD32()
        rd.fmt = 0b00
        rd.type = 0b00000
        rd.length = 1
        rd.first_be = 0xf
        rd.address = address//4
        rd.requester_id = 0x100
        rd.encode_dwords()
        packet = bytes()
        for dword in rd.dwords:
            packet += dword.to_bytes(4, byteorder="little")
        self.socket.sendto(packet, (self.ip, self.port))

這種方法的優點是,不僅可以使用Wireshark解剖器或任何其他捕獲和顯示方法,但發送/接收TLP很簡單。當然,需要了解PCIe的工作原理。請注意,在另一個UDP端口上,我們可以管理與PCIe內核本身相關的所有內容。

fpga中的PCIe內核支持64位配置地址。以下是使用FPGA卡對SecureROM進行轉儲(有點棘手)的預覽

 
00000000  00 00 00 90 00 00 00 91  81 18 00 58 fe 20 00 94  |...........X. ..|
00000010  3f 00 00 eb 80 01 00 54  fe 03 01 aa 22 18 00 58  |?......T...."..X|
00000020  c3 17 00 58 42 00 03 cb  03 10 40 a9 23 10 00 a9  |...XB.....@.#...|
00000030  00 40 00 91 21 40 00 91  42 40 00 f1 61 ff ff 54  |.@..!@..B@..a..T|
00000040  c0 03 5f d6 df 4f 03 d5  1e 00 00 90 de 53 13 91  |.._..O.......S..|
00000050  6a 00 00 b0 4a 01 00 91  0a c0 1e d5 ea 17 00 58  |j...J..........X|
00000060  0b 18 00 58 6b 01 0a 8b  0c 00 80 d2 4c 31 00 a9  |...Xk.......L1..|
00000070  4a 41 00 91 5f 01 0b eb  a1 ff ff 54 ea 16 00 58  |JA.._......T...X|
00000080  4a 05 40 91 5f 01 00 91  bf 40 00 d5 4a 09 40 91  |J.@._....@..J.@.|
00000090  5f 01 00 91 54 09 40 91  ca 14 00 58 0b 00 82 d2  |_...T.@....X....|
000000a0  6b 05 00 d1 4a 01 0b 8b  4a 01 2b 8a 6b 14 00 58  |k...J...J.+.k..X|
000000b0  5f 01 0b eb 00 01 00 54  4c 14 00 58 4d 39 40 a9  |_......TL..XM9@.|
000000c0  6d 39 00 a9 4a 41 00 91  6b 41 00 91 7f 01 0c eb  |m9..JA..kA......|
000000d0  61 ff ff 54 aa 13 00 58  cb 13 00 58 ec 01 80 d2  |a..T...X...X....|
000000e0  6c 01 2c 8a 0d 00 80 d2  4d 35 81 a8 5f 01 0c eb  |l.,.....M5.._...|
000000f0  c1 ff ff 54 7f 01 0c eb  80 00 00 54 4d 45 00 b8  |...T.......TME..|
00000100  5f 01 0b eb c1 ff ff 54  0b 04 40 90 6b 01 08 91  |_......T..@.k...|
00000110  74 01 00 f9 c0 03 5f d6  00 00 00 00 00 00 00 00  |t....._.........|
00000120  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000200  53 65 63 75 72 65 52 4f  4d 20 66 6f 72 20 73 38  |SecureROM for s8|
00000210  30 30 30 73 69 2c 20 43  6f 70 79 72 69 67 68 74  |000si, Copyright|
00000220  20 32 30 30 37 2d 32 30  31 34 2c 20 41 70 70 6c  | 2007-2014, Appl|
00000230  65 20 49 6e 63 2e 00 00  00 00 00 00 00 00 00 00  |e Inc...........|
00000240  52 45 4c 45 41 53 45 00  00 00 00 00 00 00 00 00  |RELEASE.........|
00000250  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000280  69 42 6f 6f 74 2d 32 32  33 34 2e 30 2e 30 2e 33  |iBoot-2234.0.0.3|
00000290  2e 33 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |.3..............|
000002a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000300  00 02 00 00 01 00 00 00  40 02 00 00 01 00 00 00  |........@.......|
00000310  80 02 00 00 01 00 00 00  00 00 00 00 01 00 00 00  |................|
...

(“還要想辦法拆裝pci-e 封包”)

 

由於使用PCIe並不容易,所以沒有進行大量的測試,即使是IOMMU可以從理論上阻止攻擊者從上下文中訪問存儲器,人們可以看到這些並不總是很好地實現。根據不同的興趣,我可以用PCIe fingeredge發布此板,例如可用於在PC上訓練。

可以使用Qemu硬件驅動程序進行修改,以便輕鬆模擬現有設備,而不需要付出很大的努力。可能值得在培訓上進行教學……

Leave a Reply