🇰🇷 한글 설명
Linux kernel의 padata_reorder 함수에서 발견된 Use-After-Free(UAF) 취약점입니다. 병렬 데이터 처리 중 암호화 알고리즘이 삭제될 때 refcnt가 0으로 감소하면서 padata 인스턴스가 해제되지만, while 루프가 이미 해제된 메모리에 접근하려고 하면서 발생합니다.
💡 쉬운 설명
리눅스 커널에서 데이터를 병렬로 처리할 때 암호화 알고리즘이 삭제되는 순간 이미 삭제된 메모리를 다시 접근하려고 해서 시스템이 충돌할 수 있습니다. 로컬 공격자가 이를 이용해 권한 상승이나 서비스 거부 공격을 할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
padata: fix UAF in padata_reorder
A bug was found when run ltp test:
BUG: KASAN: slab-use-after-free in padata_find_next+0x29/0x1a0
Read of size 4 at addr ffff88bbfe003524 by task kworker/u113:2/3039206
CPU: 0 PID: 3039206 Comm: kworker/u113:2 Kdump: loaded Not tainted 6.6.0+
Workqueue: pdecrypt_parallel padata_parallel_worker
Call Trace:
<TASK>
dump_stack_lvl+0x32/0x50
print_address_description.constprop.0+0x6b/0x3d0
print_report+0xdd/0x2c0
kasan_report+0xa5/0xd0
padata_find_next+0x29/0x1a0
padata_reorder+0x131/0x220
padata_parallel_worker+0x3d/0xc0
process_one_work+0x2ec/0x5a0
If 'mdelay(10)' is added before calling 'padata_find_next' in the
'padata_reorder' function, this issue could be reproduced easily with
ltp test (pcrypt_aead01).
This can be explained as bellow:
pcrypt_aead_encrypt
...
padata_do_parallel
refcount_inc(&pd->refcnt); // add refcnt
...
padata_do_serial
padata_reorder // pd
while (1) {
padata_find_next(pd, true); // using pd
queue_work_on
...
padata_serial_worker crypto_del_alg
padata_put_pd_cnt // sub refcnt
padata_free_shell
padata_put_pd(ps->pd);
// pd is freed
// loop again, but pd is freed
// call padata_find_next, UAF
}
In the padata_reorder function, when it loops in 'while', if the alg is
deleted, the refcnt may be decreased to 0 before entering
'padata_find_next', which leads to UAF.
As mentioned in [1], do_serial is supposed to be called with BHs disabled
and always happen under RCU protection, to address this issue, add
synchronize_rcu() in 'padata_free_shell' wait for all _do_serial calls
to finish.
[1] https://lore.kernel.org/all/
[email protected]/
[2] https://lore.kernel.org/linux-kernel/jfjz5d7zwbytztackem7ibzalm5lnxldi2eofeiczqmqs2m7o6@fq426cwnjtkm/
📍 영향받는 시스템
Linux kernel 6.6.0 이상 (padata 기능 활성화), 특히 암호화 관련 pcrypt 기능을 사용하는 시스템
⚔️ 공격 벡터
로컬 공격자가 암호화 알고리즘 삭제와 병렬 데이터 처리를 동시에 트리거하여 UAF 취약점 악용
🛡️ 대응 방법
Linux kernel을 최신 패치 버전으로 업그레이드 (padata_free_shell에 synchronize_rcu() 추가된 버전)
🔧 검증 코드
6.6.0 이상이면 패치 확인 필요. 정확한 수정은 padata_free_shell에 synchronize_rcu() 호출이 포함되었는지 커널 소스에서 확인