日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BINDER SECCTX PATCH ANALYSIS

發(fā)布時(shí)間:2025/3/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BINDER SECCTX PATCH ANALYSIS 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在2019年初,Binder內(nèi)核模塊中添加了一項(xiàng)新功能。?此修補(bǔ)程序允許在Binder事務(wù)中發(fā)送調(diào)用方SElinux上下文。?該功能實(shí)際上是CVE-2019-2023的修復(fù)程序。?此漏洞與不正確使用getpidcon函數(shù)有關(guān),從而導(dǎo)致ACL繞過。

本文研究此修補(bǔ)程序的詳細(xì)信息及其對(duì)安全性的影響。

getpidcon ACL繞過

關(guān)于getpidcon()使用的問題在Android中由來已久。?Jann Horn的問題報(bào)告詳細(xì)說明了硬件服務(wù)管理器容易受到攻擊,并且由于使用了不安全的getpidcon()?,已經(jīng)報(bào)告了幾個(gè)類似的錯(cuò)誤。?正如Jann Horn在其問題之一中所解釋的,此功能不是獲取調(diào)用過程的SELinux上下文的安全方法:

這是有問題的,因?yàn)橹挥性谡{(diào)用者知道$ pid最初引用的進(jìn)程不能從僵尸過渡到死進(jìn)程(通常是因?yàn)樗? pid的父級(jí)或ptracer?getpidcon($pid)才可以安全使用。調(diào)用者可以根據(jù)$ pid指向getpidcon()之后指向的進(jìn)程的年齡,驗(yàn)證$ pid引用的進(jìn)程在$ pid引用正確的進(jìn)程之前是否已經(jīng)生成。?(同一件事幾乎適用于所有引用使用PID的進(jìn)程的API。)

換句話說,存在競(jìng)爭(zhēng)條件:給定pid引用的過程可以在接收到事務(wù)的時(shí)間與對(duì)getpidcon的調(diào)用之間進(jìn)行更改。

解決此設(shè)計(jì)問題的一種干凈方法是將SELinux上下文與活頁夾事務(wù)一起發(fā)送。?這就是我們今天將分析的補(bǔ)丁的目的。

補(bǔ)丁概述

補(bǔ)丁詳細(xì)信息可在lore.kernel.org上找到?。?提交標(biāo)題為“創(chuàng)建節(jié)點(diǎn)標(biāo)志以請(qǐng)求發(fā)送者的安全上下文”。

讓我們分析此補(bǔ)丁的主要部分:

// @@ -3020,6 +3027,20 @@靜態(tài)空值bind_transaction(struct bind_proc * proc,t- > 標(biāo)志 = tr- > 標(biāo)志;t- > 優(yōu)先級(jí) = task_nice(當(dāng)前);+ if (target_node && target_node- > txn_security_ctx) {+ u32 secid;++ security_task_getsecid( proc- > tsk 和 secid);+ ret = security_secid_to_secctx(secid, & secctx, & secctx_sz);+ if (ret) {+ return_error = BR_FAILED_REPLY;+ return_error_param = ret;+ return_error_line = __LINE__;+ 轉(zhuǎn)到 err_get_secctx_failed;+ }+ extra_buffers_size + = ALIGN(secctx_sz, sizeof (u64));+ }+ if (secctx) {+ size_t buf_offset = ALIGN( tr- > data_size, sizeof ( void * )) ++ ALIGN( tr- > offsets_size, sizeof ( void * )) ++ ALIGN(extra_buffers_size, sizeof ( void * )) -+ ALIGN(secctx_sz, sizeof (u64));+ char * kptr = t- > 緩沖區(qū) -> 數(shù)據(jù) + buf_offset;++ t- > security_ctx = ( uintptr_t )kptr ++ binder_alloc_get_user_buffer_offset( & target_proc- > 分配 );+ memcpy(kptr, secctx, secctx_sz);+ security_release_secctx(secctx, secctx_sz);+ secctx = NULL;+ }

發(fā)送綁定程序事務(wù)時(shí),內(nèi)核會(huì)檢查目標(biāo)進(jìn)程是否需要SELinux上下文(?target_node->txn_security_ctx?)。?可以在綁定器對(duì)象初始化上使用標(biāo)志FLAT_BINDER_FLAG_TXN_SECURITY_CTX來指定此選項(xiàng)。

例如,硬件服務(wù)管理器啟用此功能:

//platform/system/hwservicemanager/service.cppint main () {// [...]sp < ServiceManager > 管理器 = 新 ServiceManager();setRequestingSid(manager, true);}

啟用此功能后,內(nèi)核會(huì)增加extra_buffers_size的大小以在之后存儲(chǔ)安全上下文。?收到的交易如下:

?

活頁夾接收事務(wù)緩沖區(qū)

然后,接收者可以使用getCallingPid()檢索事務(wù)中的安全上下文。

pid_t IPCThreadState :: getCallingPid() 常量{返回 mCallingPid;}// /platform/system/libhwbinder/IPCThreadState.cppstatus_t IPCThreadState :: executeCommand( int32_t cmd){// [...]structinder_transaction_data_secctx {struct binder_transaction_data transaction_data;binding_uintptr_t secctx;};binding_transaction_data_secctx tr_secctx;活頁夾數(shù)據(jù) & tr = tr_secctx.transaction_data;如果 (cmd == ( int ) BR_TRANSACTION_SEC_CTX) {結(jié)果 = mIn.read( & tr_secctx, sizeof (tr_secctx));} 其他 {結(jié)果 = mIn.read( & tr, sizeof (tr));tr_secctx.secctx = 0 ;}// ...mCallingSid = reinterpret_cast < const char *> (tr_secctx.secctx);

漏洞1:整數(shù)溢出

快速瀏覽可以確定整數(shù)溢出。

extra_buffers_size + = ALIGN(secctx_sz, sizeof (u64));

用戶通過BC_TRANSACTION_SG事務(wù)完全控制BC_TRANSACTION_SG?。?如果extra_buffers_size?,?tr->data_size和tr->offsets_size等于零,則以下指令將在t->buffer->data?buf_offset?t->buffer->data之前復(fù)制安全上下文(?buf_offset為負(fù))。

size_t buf_offset = ALIGN( tr- > data_size, sizeof ( void * )) +ALIGN( tr- > offsets_size, sizeof ( void * )) +ALIGN(extra_buffers_size, sizeof ( void * )) -ALIGN(secctx_sz, sizeof (u64));char * kptr = t- > 緩沖區(qū) -> 數(shù)據(jù) + buf_offset;t- > security_ctx = (binder_uintptr_t)kptr +binding_alloc_get_user_buffer_offset( & target_proc- > alloc);memcpy(kptr, secctx, secctx_sz);

此漏洞被標(biāo)識(shí)為CVE-2019-2181并在提交0b0509508beff65c1d50541861bc0d4973487dc5中進(jìn)行了修補(bǔ)?。

它已在2019年9月的Android安全公告中發(fā)布.https:?//source.android.com/security/bulletin/2019-09-01.html#kernel-components

漏洞2:安全上下文覆蓋

當(dāng)綁定程序事務(wù)包含BINDER_TYPE_PTR對(duì)象時(shí),內(nèi)核會(huì)在extra部分復(fù)制發(fā)送方進(jìn)程的緩沖區(qū)。?我們可以在上面看到,為了存儲(chǔ)安全上下文,增加了extra_buffers_size?。?但是,內(nèi)核不會(huì)在額外緩沖區(qū)中區(qū)分標(biāo)準(zhǔn)數(shù)據(jù)和安全上下文。?用戶可以制作一個(gè)綁定交易,該交易會(huì)覆蓋安全上下文。

BINDER_TYPE_PTR覆蓋安全上下文

這比getpidcon()競(jìng)爭(zhēng)條件更容易繞過ACL!

此漏洞已通過名為的提交進(jìn)行了修補(bǔ):?活頁夾:正確設(shè)置SG緩沖區(qū)的結(jié)尾

結(jié)論

Binder內(nèi)核補(bǔ)丁的目的是提高安全性,并提供另一種方法來檢索調(diào)用進(jìn)程的上下文,以避免使用getpidcon()?。

矛盾的是,最初的補(bǔ)丁程序版本增加了更多的安全漏洞,并使ACL旁路比以前的漏洞更容易!

總結(jié)

以上是生活随笔為你收集整理的BINDER SECCTX PATCH ANALYSIS的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。