Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2022-1015 — Linux 커널 1일차 분석 및 악용 | Kitploit
도구/GitHubGitHub/more-kohii/cve-2022-1015
Vulnerability AnalysisExploitationLearning & EducationBinary Exploitation
GitHubmore-kohii/cve-2022-1015

CVE-2022-1015

Linux 커널 1일차 분석 및 악용

저장소 보기
113년 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2022-1015

Route Cause

nft_parse_register 함수에서 arg가 default로 넘어갈 때에 대한 검증을 하지 않아 nft_do_chain 함수의 stack에서 oob가 터짐.

이때 payload expression을 이용하면 read, write를 둘 다 할 수 있다.

payload는 아래와 같은 동작을 하게 된다.

image

즉, 인덱스를 적절히 조절하면 stack에서 oob read, write를 할 수 있음.

하지만, regs는 validation을 하는 함수가 존재한다.

root@kitploit:~
default:
		if (reg < NFT_REG_1 * NFT_REG_SIZE / NFT_REG32_SIZE)
			return -EINVAL;
		if (len == 0)
			return -EINVAL;
		if (reg * NFT_REG32_SIZE + len >
		    sizeof_field(struct nft_regs, data))
			return -ERANGE;

		if (data != NULL && type != NFT_DATA_VALUE)
			return -EINVAL;
		return 0;

위의 코드를 보면, reg * NFT_REG32_SIZE + len > sizeof_field(struct nft_regs, data) 를 만족해야한다.

상수 넣어주면 reg * 4 + len > 80 이거 만족하면 된다.

즉, reg에 맞게 적당히 len를 조절해줘야한다.

참고할 소스 코드

  • nft_regs

root@kitploit:~
struct nft_regs {
	union {
		u32			data[20];
		struct nft_verdict	verdict;
	};
};
  • nft_do_chain

    root@kitploit:~
    unsigned int
    nft_do_chain(struct nft_pktinfo *pkt, void *priv)
    {
    	const struct nft_chain *chain = priv, *basechain = chain;
    	const struct net *net = nft_net(pkt);
    	struct nft_rule *const *rules;
    	const struct nft_rule *rule;
    	const struct nft_expr *expr, *last;
    	struct nft_regs regs;
    	...
    }
    
  • nft_parse_register

    root@kitploit:~
    static unsigned int nft_parse_register(const struct nlattr *attr)
    {
    	unsigned int reg;
    
    	reg = ntohl(nla_get_be32(attr));
    	switch (reg) {
    	case NFT_REG_VERDICT...NFT_REG_4:
    		return reg * NFT_REG_SIZE / NFT_REG32_SIZE;
    	default:
    		return reg + NFT_REG_SIZE / NFT_REG32_SIZE - NFT_REG32_00;
    	}
    }
    
  • 도구 다운로드