Linux 커널에서는 다음 취약점이 해결되었습니다. 할 수 있습니다: gw: cgw_csum_crc8_rel()에서 OOB 힙 액세스를 수정합니다. cgw_csum_crc8_rel()은 calc_idx()를 통해 경계 안전 인덱스를 올바르게 계산합니다. int from = calc_idx(crc8->from_idx, cf->len); int to = calc_idx(crc8->to_idx, cf->len); int res = calc_idx(crc8->result_idx, cf->len); if (< 0 ||에서 < 0 || res < 0까지) 반환; 그러나 루프와 결과 쓰기는 원시 s8 필드를 직접 사용합니다. 컴 대신에
Linux 커널에서는 다음 취약점이 해결되었습니다.
할 수 있습니다: gw: cgw_csum_crc8_rel()에서 OOB 힙 액세스를 수정합니다.
cgw_csum_crc8_rel()은 calc_idx()를 통해 경계 안전 인덱스를 올바르게 계산합니다.
int from = calc_idx(crc8->from_idx, cf->len);
int to = calc_idx(crc8->to_idx, cf->len);
int res = calc_idx(crc8->result_idx, cf->len);
if (< 0 ||에서 < 0 || res < 0까지)
반환;
그러나 루프와 결과 쓰기는 원시 s8 필드를 직접 사용합니다. 계산된 변수 대신:
for (i = crc8->from_idx; ...) /* 버그: 원시 음수 인덱스 */
cf->데이터[crc8->result_idx] = ...; /* 버그: 원시 음수 인덱스 */
64바이트 CAN FD 프레임에서 from_idx = to_idx = result_idx = -64인 경우, calc_idx(-64, 64) = 0이므로 가드는 통과하지만 루프는 다음과 같이 반복됩니다. i = -64, cf->data[-64]를 읽고 쓰기는 cf->data[-64]로 이동합니다. 이 쓰기는 56(7.0-rc) 또는 40(<= 6.19)바이트 이전에 끝날 수 있습니다. 힙에서 canfd_frame의 시작입니다.
동반 함수 cgw_csum_xor_rel()은 from/to/res를 사용합니다.
전체적으로 정확하게; 일치하도록 cgw_csum_crc8_rel()을 수정합니다.
linux-7.0-rc2에서 KASAN으로 확인되었습니다. 버그: KASAN: cgw_csum_crc8_rel+0x515/0x5b0의 슬래브가 경계를 벗어났습니다. poc_cgw_oob/62 작업으로 addr ffff8880076619c8에서 크기 1을 읽습니다.
can-gw crc8 체크섬을 구성하려면 CAP_NET_ADMIN이 필요합니다.
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 88.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 88.00 |
VPI 공식 vpi-v1 기준