[하루한줄] CVE-2022-27666: Exploit esp6 modules in Linux kernel

URL

Exploit esp6 modules in Linux kernel

Target

Ubuntu Desktop 21.10

Explain

CVE-2022-27666는 Linux의 esp6 암호화 모듈에서 발견된 취약점입니다.

8-page 크기의 버퍼에 8-page 보다 큰 유저 메시지를 전달할 수 있기 때문에 취약점 buffer overflow가 발생합니다.

bool skb_page_frag_refill(unsigned int sz, struct page_frag *pfrag, gfp_t gfp)
{
        if (pfrag->offset + sz <= pfrag->size)
		return true;
	...
	if (SKB_FRAG_PAGE_ORDER &&
	    !static_branch_unlikely(&net_high_order_alloc_disable_key)) {

		pfrag->page = alloc_pages((gfp & ~__GFP_DIRECT_RECLAIM) |
					  __GFP_COMP | __GFP_NOWARN |
					  __GFP_NORETRY,
					  SKB_FRAG_PAGE_ORDER);
		...
	}
	...
	return false;
}

위 코드는 최대 8-page 크기의 버퍼를 할당하는 함수 skb_page_frag_refill()입니다.

static int null_skcipher_crypt(struct skcipher_request *req)
{
	struct skcipher_walk walk;
	int err;

	err = skcipher_walk_virt(&walk, req, false);

	while (walk.nbytes) {
		if (walk.src.virt.addr != walk.dst.virt.addr)
			// out-of-bounds write
			memcpy(walk.dst.virt.addr, walk.src.virt.addr,
			       walk.nbytes);
		err = skcipher_walk_done(&walk, 0);
	}

	return err;
}

위는 함수 null_skcipher_crypt()의 코드입니다. memcpy()를 통해 8-page 버퍼에 8-page 보다 많은 데이터를 복사할 수 있습니다.