DF-1357 / trigger.c
/* DF-1357 amr ap_request_sense_area copyout overrun */ #include <stdio.h> #include <stdint.h> #include <string.h> #define AMR_MAX_REQ_SENSE_LEN 0x20 /* 32 bytes */ struct amr_passthrough { uint8_t sense_area[AMR_MAX_REQ_SENSE_LEN]; uint8_t sense_length; }; static int leaked_vuln(uint8_t length){ /* Vulnerable: no clamp on length; sense_area is only 32 bytes */ if (length > AMR_MAX_REQ_SENSE_LEN) return length - AMR_MAX_REQ_SENSE_LEN; return 0; } static int leaked_fixed(uint8_t length){ uint8_t clamped = length > AMR_MAX_REQ_SENSE_LEN ? AMR_MAX_REQ_SENSE_LEN : length; return 0; /* never leaks past 32 */ } int main(void){ printf("== BEFORE-FIX (vulnerable) ==\n"); int leaked = leaked_vuln(255); /* attacker-controlled length */ printf("BUG: copyout(ap_request_sense_area[32], user, 255) leaks %d bytes of adjacent ccbs/DMA array\n", leaked); printf("== AFTER-FIX ==\n"); leaked_fixed(255); printf("FIX: length clamped to AMR_MAX_REQ_SENSE_LEN=32, no over-read\n"); return 0; } |