🇰🇷 한글 설명
Linux 커널 SCSI libiscsi_tcp 드라이버에서 Data-In PDU의 데이터 방향을 검사하지 않아, 쓰기 명령의 ITT에 대해 대상(target)이 보낸 Data-In 데이터가 쓰기 대상 페이지(O_DIRECT의 사용자 버퍼 또는 버퍼드 쓰기의 페이지 캐시)에 복사될 수 있습니다. 이로 인해 데이터 무결성이 훼손되고 악성 대상이 호스트 메모리 내용을 조작할 수 있습니다.
💡 쉬운 설명
악의적이거나 오작동하는 iSCSI 저장장치가 쓰기 요청에 가짜 응답 데이터를 보내면, 리눅스가 이를 그대로 저장하려던 파일 내용에 덮어씌울 수 있습니다. 그 결과 파일이 조용히 손상되거나 잘못된 데이터가 읽히게 됩니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
scsi: libiscsi_tcp: Check the data direction of a Data-In PDU
The Data-In branch of iscsi_tcp_hdr_dissect() resolves the ITT to a task
and copies the PDU's data segment into that command's scatterlist without
asking whether the command was reading. iscsi_tcp_r2t_rsp() in the same
file does ask, and rejects an R2T for a command that is not DMA_TO_DEVICE.
A target that answers a WRITE command's ITT with a Data-In therefore has
the initiator write target-supplied bytes into the pages that write was
about to send. Those are the caller's own pinned pages for an O_DIRECT
write, and page cache pages for a buffered one.
Observed against a test target that emits one 512-byte Data-In naming a 128
KB write's ITT, after the R2T for that write. With O_DIRECT the caller's
buffer ends up holding 512 bytes of the target's data while pwrite()
returns 131072. Buffered is quieter: pwrite() and fsync() both succeed,
nothing is logged, and reading those blocks back returns the target's bytes
out of the page cache without a command going on the wire.
Check the direction before using the scatterlist, the way the R2T path
already does.
📍 영향받는 시스템
iSCSI 초기자(initiator)를 사용하는 Linux 커널 (libiscsi_tcp 모듈 포함, 수정 전 버전)
⚔️ 공격 벡터
네트워크상의 악의적이거나 손상된 iSCSI 대상 서버가 쓰기 명령의 ITT에 대해 Data-In PDU를 전송하여 초기자 메모리/페이지 캐시에 임의 데이터를 기록하게 함
🛡️ 대응 방법
Linux 커널을 해당 CVE의 수정이 포함된 최신 안정 버전으로 업데이트하고 재부팅
🔧 검증 코드
커널 버전이 배포판 보안 공지에서 해당 CVE 수정이 포함된 버전 이상이면 패치된 것이며, 이전 버전이면 업데이트가 필요합니다. 모듈 정보가 출력되지 않으면 libiscsi_tcp를 사용하지 않는 환경입니다.
uname -r && (modinfo libiscsi_tcp 2>/dev/null | grep -E 'version|filename')