這張照片顯示,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供電,給它定時鐘,並且有一個插座以連接它。
如前所示,整個設置看起來像這樣。
夾具適配器
問題在於,每當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硬件驅動程序進行修改,以便輕鬆模擬現有設備,而不需要付出很大的努力。可能值得在培訓上進行教學……