成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入分析TIMA任意內核模塊認證繞過漏洞

安全 漏洞
為了確保Android設備中Linux內核的完整性,三星推出了一個名為“lkmauth”的功能。每當內核嘗試載入內核模塊時,系統就會用到“lkmauth”功能。

[[181702]]

前言

為了確保Android設備中Linux內核的完整性,三星推出了一個名為“lkmauth”的功能。該功能的最初目的是,確保只有三星核準的那些內核模塊才可以加載到Linux內核中。

TIMA任意內核模塊認證繞過漏洞分析

每當內核嘗試載入內核模塊時,系統就會用到“lkmauth”功能。在加載內核模塊之前,內核首先會加載“lkmauth”的trustlet,并發送一個請求,來驗證模塊的完整性。

由于三星設備使用了兩個不同的TEE,所以對于每個TEE都單獨實現了相應的“lkmauth”功能。

在使用QSEE TEE(它使用了內核配置TIMA_ON_QSEE)的設備上,使用“tima_lkmauth”的trustlet來驗證待加載的內核模塊的完整性。當然,這個trustlet本身是相當簡單的——它提供了一個硬編碼的列表,來保存所有“可允許”的內核模塊的SHA1哈希值。如果當前待加載的內核模塊的SHA1沒有出現在硬編碼的列表中,那么它就會被拒絕。

對于使用MobiCore TEE(使用內核配置TIMA_ON_MC20)的設備而言,它們會通過“ffffffff00000000000000000000000b.tlbin”trustlet來驗證待加載內核模塊的完整性。然而,在這種情況下,其流程會稍微有點復雜,下面簡單介紹加載模塊的具體步驟:

  1. [如果trustlet尚未加載]:加載trustlet。
  2. [如果已批準的哈希值列表尚未加載]:向trustlet發送請求,以便加載已批準的SHA1哈希簽名列表。
  3. 將存放內核模塊的緩沖區傳遞給trustlet進行驗證。如果該內核模塊的SHA1哈希值不在先前加載的已批準哈希值列表中,則會被拒絕。

已經批準的模塊的哈希值組成的列表,將作為設備固件的一部分,存儲在文件“/system/lkm_sec_info”中。該文件的結構如下所示:

  1. <LIST_OF_APPROVED_SHA1_HASHES> || <RSA-SHA1(LIST_OF_APPROVED_HASHES)> 

RSA簽名本身會使用PKCS#1 v1.5進行填充,其中BT = 1,PS是0xFF字節的常量字符串。

用于驗證簽名的公鑰,我們可以通過靜態分析方法從trustlet中找到。在trustlet的自身代碼中,2048位的模數(N)是以反向字節順序硬編碼的形式存在的。經驗證,在許多不同的設備和版本(如GT-I9300、SM-P600、SM-G925V等)中,都使用了相同的常量模量。這個模數本身是

  1. 23115949866714941391353337177289175219285878274139282906616665210063884406381659531323213685988661310147714551519208211866717752764819593136041821730036424774768373518089158559738346399417711215445691103520271683108620470478217421253901045241463596145712323679479119182170178158376677146612087823704797563128645982031650495998390419939015769566125776929249878666421780560391442439477189264423758971325406632562977618217815844688082799802924540355522191958147326121713251815752299744182840538928330568160188518794896256711464745438125835732128172016078553039694575936536720388879378619731459541542508235684590815108447 

這里使用的公鑰指數為3。

發送到trustlet的請求緩沖區具有以下結構:

  1. /* Message types for the lkmauth command */ 
  2. typedef struct lkmauth_hash_s { 
  3. uint32_t cmd_id; 
  4. uint32_t hash_buf_start;/* starting address of buf for ko hashes */ 
  5. uint32_t hash_buf_len;/* length of hash buf, should be multiples of 20 bytes */ 
  6. uint8_t ko_num;/* total number ko */ 
  7. } __attribute__ ((packed)) lkmauth_hash_t; 

通過對trustlet中處理這個命令的代碼進行逆向工程,得到了處理函數高級邏輯代碼,具體如下所示:

  1. int load_hash_list(char* hash_buf_start, uint32_t hash_buf_len, uint8_t ko_num) { 
  2.   //Checking the signature of the hash buffer, without the length of the 
  3.   //public modulus (256 bytes = 2048 bits) 
  4.   uint32_t hash_list_length = hash_buf_len - 256; 
  5.   char* rsa_signature_blob = hash_buf_start + hash_list_length; 
  6.   if (verify_rsa_signature(hash_buf_start, hash_list_length, rsa_signature_blob)) 
  7.     return SIGNATURE_VERIFICATION_FAILURE; 
  8.   //Copying in the verified hashes into the trustlet 
  9.   //SHA1 hashes are 20 bytes long (160 bits) each 
  10.   //The maximal number of copied hashes is 0x23 
  11.   //g_hash_list is a list in the BSS section of the trustlet 
  12.   //g_num_hashes is also in the BSS section of the trustlet 
  13.   uint8_t i; 
  14.   for (i=0; i<ko_num && i<0x23; i++) { 
  15.     memcpy(g_hash_list + i*20, hash_buf_start + i*20, 20); 
  16.   } 
  17.   g_num_hashes = i
  18.   return SUCCESS; 

問題在于,上述代碼包含了一個邏輯缺陷:沒有對“ko_num”字段進行相應的驗證,以確保其匹配哈希值列表的實際長度。這意味著攻擊者能夠欺騙trustlet來加載額外的“允許哈希值”,即使它們不是已經簽名的blob的一部分。為此,可以在提供與哈希值列表的原始長度匹配的"hash_buf_len"的時候,通過提供一個大于實際哈希值數量的“ko_num”字段來達到這一目的。然后,攻擊者可以在緩沖器中的簽名blob之后提供任意的SHA1哈希值,從而導致這些額外的哈希值也會被復制到已經批準的可信哈希值列表中。

下面給出此類攻擊的一個具體例子:

  1. hash_buf_start = <ORIGINAL_SIGNED_HASH_LIST> || 
  2.                    <RSA-SHA1(ORIGINAL_SIGNED_HASH_LIST)> || 
  3.                    <4 GARBAGE BYTES> || 
  4.                    <ATTACKER_CONTROLLED_SHA1_HASH> 
  5.   hash_buf_len = len(<ORIGINAL_SIGNED_HASH_LIST>) + 
  6.                  len(<RSA-SHA1(ORIGINAL_SIGNED_HASH_LIST)>
  7.   ko_num = (<ORIGINAL_SIGNED_HASH_LIST>/20) + ceil(256/20) + 1 

由于“/system/lkm_sec_info”中的原始哈希值列表長度總是很短(例如從來不超過8)的,因此表達式(( / 20)+ ceil(256/20)+1)的值永遠不會大于22。但是它仍然小于0x23(35)個哈希值的硬編碼下限,這意味著上面的代碼能夠正常執行所提供的命令。此后,已批準的哈希值列表將會變成如下所示的結構:

  1. original_approved_hash_1 
  2. original_approved_hash_2 
  3. ... 
  4. original_approved_hash_n 
  5. bytes_00_to_20_of_rsa_signature 
  6. bytes_20_to_40_of_rsa_signature 
  7. ... 
  8. bytes_240_to_256_of_rsa_signature || 4_garbage_bytes 
  9. attacker_controlled_sha1_hash 

實際上,這就將攻擊者控制的SHA1哈希值插入到了已批準的哈希值列表中,從而成功繞過了簽名驗證。

該漏洞的一種利用方法是,控制一個可以加載內核模塊的進程,然后將感染的哈希值列表請求發送給trustlet。例如,“system_server”進程就具有這種能力,同時還能夠加載trustlet,并與之進行通信(我們已經在SM-G925V的默認SELinux策略中進行了相應的驗證):

  1. allow system_server mobicore-user_device : chr_file { ioctl read write getattr lock append open } ;  
  2. allow system_server mobicoredaemon : unix_stream_socket connectto ;  
  3. allow system_server mobicore_device : chr_file { ioctl read write getattr lock append open } ; 

將受感染的哈希值列表加載到trustlet之后,攻擊者就可以嘗試加載與剛才插入到列表中的SHA1哈希值相匹配的內核模塊了。需要注意的是,加載模塊的第一次嘗試將會失敗,因為內核將嘗試加載已批準的哈希值列表本身,但是trustlet將檢測到此情況并返回錯誤代碼RET_TL_TIMA_LKMAUTH_HASH_LOADED。這樣的話,內核會做一個標記,指出列表已經加載好了——也就是說,下一次加載模塊的時候,就不會重新加載這個列表了:

  1. ... 
  2. else if (krsp->ret == RET_TL_TIMA_LKMAUTH_HASH_LOADED) { 
  3.   pr_info("TIMA: lkmauth--lkm_sec_info already loaded\n"); 
  4.   ret = RET_LKMAUTH_FAIL
  5.   lkm_sec_info_loaded = 1
  6. ... 

之后,第二次嘗試加載已經感染的模塊的時候,就會成功了,因為它的哈希值已經位于已批準的哈希值列表中了。

責任編輯:趙寧寧 來源: 安全客
相關推薦

2019-07-08 20:00:35

Linux內核模塊

2010-01-22 11:01:04

linux內核模塊

2009-12-11 09:42:54

Linux內核源碼進程調度

2009-12-11 09:47:23

Linux內核源碼進程調度

2009-12-17 15:28:32

內核模塊編譯

2017-09-28 10:12:51

2010-11-26 13:10:17

2010-04-12 11:19:47

編譯內核模塊

2018-06-19 09:07:57

Linux內核模塊

2023-05-08 08:05:42

內核模塊Linux

2010-09-07 14:21:22

PPPoE協議

2022-04-12 08:30:45

TomcatWeb 應用Servlet

2011-03-23 11:01:55

LAMP 架構

2021-09-03 08:44:51

內核模塊Linux社區

2010-09-29 14:21:22

2023-02-01 08:13:30

Redis內存碎片

2011-09-01 13:51:52

JavaScript

2010-03-08 14:53:48

Linux分區

2009-12-16 16:39:01

Visual Stud

2009-06-10 18:12:38

Equinox動態化OSGi動態化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 9色网站| 视频在线观看一区二区 | 99亚洲国产精品 | 欧美日韩视频 | 欧美三级在线 | 亚洲国产精品一区二区久久 | 天天操天天干天天曰 | 久久国产精品-久久精品 | 欧美久久免费观看 | 欧美午夜精品理论片a级按摩 | 精品一区av | 国产四虎 | 久久久高清 | 久久九七 | 欧美在线国产精品 | 久热久热| 青青久草| 8x国产精品视频一区二区 | 天堂资源最新在线 | 中文字幕av在线播放 | 精品九九久久 | 中文字幕高清av | 国产一区二区三区网站 | 理论片免费在线观看 | 激情五月婷婷综合 | 国产特级毛片aaaaaa喷潮 | 日韩在线免费 | 国产亚洲精品a | 欧美亚洲综合久久 | 久干网 | 欧美一区二区三区四区在线 | 国产日韩欧美 | 欧美a在线 | 国产亚洲精品一区二区三区 | av在线一区二区三区 | 国产91av视频 | av在线电影网站 | 日日夜夜精品 | 欧美精品综合在线 | 午夜寂寞影院在线观看 | 免费国产视频在线观看 |