Linux 커널에서는 다음 취약점이 해결되었습니다. ipv6: rpl: ipv6_rpl_srh_decompress()에서 hdrlen 오버플로 수정 ipv6_rpl_srh_decompress()는 다음을 계산합니다. outhdr->hdrlen = (((n + 1) * sizeof(struct in6_addr)) >> 3); hdrlen은 __u8입니다. n >= 127의 경우 결과는 255를 초과하고 자동으로 잘립니다. n=127(cmpri=15, cmpre=15, pad=0, hdrlen=16)인 경우: (128 * 16) >> 3 = 256, __u8로 0으로 잘림 ipv6_rpl_srh_rcv()의 호출자는 압축된 헤더를 배치합니다. buf + ((ohdr->hdrl에서
Linux 커널에서는 다음 취약점이 해결되었습니다.
ipv6: rpl: ipv6_rpl_srh_decompress()에서 hdrlen 오버플로 수정
ipv6_rpl_srh_decompress()는 다음을 계산합니다.
outhdr->hdrlen = (((n + 1) * sizeof(struct in6_addr)) >> 3);
hdrlen은 __u8입니다. n >= 127의 경우 결과는 255를 초과하고 자동으로 잘립니다. n=127(cmpri=15, cmpre=15, pad=0, hdrlen=16)인 경우:
(128 * 16) >> 3 = 256, __u8로 0으로 잘림
ipv6_rpl_srh_rcv()의 호출자는 압축된 헤더를 배치합니다. buf + ((ohdr->hdrlen + 1) << 3). hdrlen=0이면 buf + 8입니다. 그러나 압축이 풀린 영역은 buf[0..2055](8바이트 헤더)를 차지합니다. 플러스 128개의 전체 주소). 압축된 헤더가 데이터의 압축을 풀고 ipv6_rpl_srh_compress()가 여기에 씁니다. 중복되어 전달된 패킷의 라우팅 헤더가 손상됩니다.
exthdrs.c:546의 기존 가드는 (n + 1) > 255를 확인합니다. n+1이 부호 없는 문자가 오버플로되는 것을 방지합니다(segment_left 필드), 그러나 계산된 hdrlen이 오버플로되는 것을 방지하지는 않습니다. __u8. 128 <= 255이기 때문에 n=127은 통과하지만 hdrlen=256은 통과하지 않습니다. 적합하다.
경계를 (n + 1) > 127로 강화합니다. 이렇게 하면 n이 126으로 제한됩니다. hdrlen = (127 * 16) >> 3 = 254, 이는 __u8에 맞습니다. 압축된 헤더는 정확히 buf + ((254 + 1) << 3) = buf + 2040에 도달합니다. 압축이 풀린 영역(buf[0..2039])을 지나갑니다. 중복되지 않습니다. 127 세그먼트는 현실적인 RPL 배포를 훨씬 뛰어넘습니다.
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 98.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 98.00 |
VPI 공식 vpi-v1 기준