🇰🇷 한글 설명
Linux 커널의 UBIFS 파일 시스템에서 서명 길이 확인 시 잘못된 연산으로 인해 경계 외 읽기(Out-of-bounds read) 취약점이 발생합니다. 공격자가 조작된 UBIFS 이미지를 마운트할 경우, 서명 페이로드의 길이를 실제 할당된 메모리보다 크게 설정하여 메모리 범위를 벗어난 읽기가 가능해집니다.
💡 쉬운 설명
파일의 서명을 확인하는 과정에서 실제 크기보다 더 큰 데이터를 읽으려고 시도하는 오류가 있습니다. 이를 통해 해커가 조작된 파일을 시스템에 연결하면 컴퓨터의 메모리 일부를 잘못 읽어낼 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
ubifs: fix out-of-bounds read in signature length check
ubifs_sb_verify_signature() bounds the on-disk ubifs_sig_node->len field
before handing the signature payload to verify_pkcs7_signature(), but the
check has the wrong sign:
if (le32_to_cpu(signode->len) > snod->len + sizeof(struct ubifs_sig_node))
The signature bytes start sizeof(struct ubifs_sig_node) (UBIFS_SIG_NODE_SZ,
64 bytes) into the node, so the payload is at most
snod->len - sizeof(struct ubifs_sig_node)
bytes long. Adding the header size instead of subtracting it accepts a
declared length up to 2 * UBIFS_SIG_NODE_SZ larger than the node actually
holds -- past the end of c->sbuf, which is vmalloc(c->leb_size).
verify_pkcs7_signature() -> pkcs7_parse_message() -> asn1_ber_decoder()
is then handed that inflated length and reads beyond the allocation while
walking the DER headers. The node length comes straight from the mounted
image, so a crafted signed UBIFS image reaches this via
ubifs_read_superblock() before the signature is cryptographically checked.
snod->len is guaranteed to be >= UBIFS_SIG_NODE_SZ by the node scanner
(c->ranges[UBIFS_SIG_NODE].min_len == UBIFS_SIG_NODE_SZ), so the corrected
subtraction cannot underflow. Legitimately signed images are unaffected: a
correct superblock never declares a signature longer than the node it is
embedded in.
📍 영향받는 시스템
Linux kernel (UBIFS 파일 시스템을 사용하는 시스템)
⚔️ 공격 벡터
조작된 서명 길이를 포함한 UBIFS 이미지를 시스템에 마운트하여 발생
🛡️ 대응 방법
UBIFS 서명 길이 검증 로직이 수정된 최신 Linux 커널로 업데이트
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 패치된 보안 업데이트 버전인지 확인