⬢ DragonFlyBSD Kernel Audit
DF-4948 / manifest.json
← back to finding ↓ download raw
{
  "verdict": "reproduced",
  "impact": "leak",
  "confidence": "certain",
  "kernel_refs": [
    "sys/dev/misc/ipmi/ipmi_smic.c:320-336",
    "sys/dev/misc/ipmi/ipmi_smic.c:341",
    "sys/dev/misc/ipmi/ipmi_smic.c:346-350",
    "sys/dev/misc/ipmi/ipmi.c:448-468",
    "sys/dev/misc/ipmi/ipmi.c:401-403",
    "sys/dev/misc/ipmi/ipmi.c:534-546",
    "sys/dev/misc/ipmi/ipmi.c:831-832",
    "sys/sys/ipmi.h:35",
    "sys/dev/misc/ipmi/ipmi_kcs.c:411-432"
  ],
  "reproduce": {
    "build": "guest# sh /root/smicshock/build.sh   (module compiles the VERBATIM /usr/src ipmi_smic.c via -DLOCAL_MODULE + mock <ipmivars.h> INB/OUTB; sink needs QEMU '-device ipmi-bmc-sim,id=bmc0 -device isa-ipmi-kcs,bmc=bmc0' and 'kldload ipmi')",
    "run": "guest# kldload /root/smicshock/smicshock.ko ; dmesg | tail   -> ir_replylen=16000 for a 1024-byte buffer (BUG DF-4948 REPRODUCED). Then end-to-end: maxx$ /tmp/leak & ; root# sysctl hw.bumpreplylen=16000 ; cat /tmp/leak.out",
    "expected": "producer: smic_polled_request()=1, req->ir_replylen=16000, req->ir_replybuflen=1024, 'SMIC: Read short: 1024 buffer, 16000 actual'. sink (3/3 runs): RECEIVE ok msg.data_len=16001, 6624-7167 nonzero kernel bytes beyond offset 1024 (first at 0x042e), kernel pointers 0xfffff8008dcfxxxx, 392-424 marker fragments. After fix.diff + kernel rebuild: ir_replylen=1024, msg.data_len=1025, zero bytes beyond 1024."
  },
  "artifacts": [
    "README.md", "VERDICT.md",
    "smicshock.c", "mock/ipmi.h", "mock/ipmivars.h", "Makefile",
    "bumpko.c", "leak.c",
    "build.sh", "run.sh",
    "build.log", "run.log", "run.2.log", "run.3.log",
    "fix.diff", "fix_build.log", "fix_run.log",
    "leak_sample.txt", "env.txt", "dmesg.txt",
    "manifest.json", "verdict.json"
  ]
}