{"record":{"id":"52a3776003a02a36","repo":"shadow1ng/fscan","slug":"failed-to-get-smb1-response-about-header-s","errorCode":null,"errorMessage":"failed to get SMB1 response about header: %s","messagePattern":"failed to get SMB1 response about header: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"plugins/services/ms17010_exp.go","lineNumber":210,"sourceCode":"\t}\n\ttyp := buf[0]\n\tif typ != 0x00 {\n\t\tconst format = \"invalid message type 0x%02X in SMB1 response\"\n\t\treturn nil, nil, fmt.Errorf(format, typ)\n\t}\n\tsizeBuf := make([]byte, 4)\n\tcopy(sizeBuf[1:], buf[1:])\n\tsize := int(binary.BigEndian.Uint32(sizeBuf))\n\t// 畸形响应（size < SMB 头长度）会导致后续 buf[:smbHeaderSize] 越界 panic\n\tif size < smbHeaderSize {\n\t\treturn nil, nil, fmt.Errorf(\"SMB1 response too short: %d bytes\", size)\n\t}\n\t// SMB\n\tbuf = make([]byte, size)\n\t_, err = io.ReadFull(conn, buf)\n\tif err != nil {\n\t\tconst format = \"failed to get SMB1 response about header: %s\"\n\t\treturn nil, nil, fmt.Errorf(format, err)\n\t}\n\tsmbHeader := smbHeader{}\n\treader := bytes.NewReader(buf[:smbHeaderSize])\n\terr = binary.Read(reader, binary.LittleEndian, &smbHeader)\n\tif err != nil {\n\t\tconst format = \"failed to parse SMB1 response header: %s\"\n\t\treturn nil, nil, fmt.Errorf(format, err)\n\t}\n\treturn buf, &smbHeader, nil\n}\n\nfunc smbClientNegotiate(conn net.Conn) error {\n\tbuf := bytes.Buffer{}\n\n\t// --------NetBIOS Session Service--------\n\n\t// message type\n\tbuf.WriteByte(0x00)","sourceCodeStart":192,"sourceCodeEnd":228,"githubUrl":"https://github.com/shadow1ng/fscan/blob/95cc12e753bf43de7004e5aef42a9ffba3934303/plugins/services/ms17010_exp.go#L192-L228","documentation":"This error is returned by smb1GetResponse when reading the SMB message body of the advertised size fails via io.ReadFull (plugins/services/ms17010_exp.go:210). The NetBIOS header promised `size` bytes but the connection closed, reset, or timed out before all of them arrived. The library throws it because a partial SMB frame cannot be parsed into a header.","triggerScenarios":"After successfully reading the 4-byte NetBIOS header with a valid type and size >= 32, the peer delivers fewer than `size` bytes: connection reset mid-frame, read deadline (10s) expiring during a large response, or server crash while flushing the reply.","commonSituations":"Patched or crashing hosts that reset the connection while sending a large reply (e.g. the 0x438-byte NT Trans response); slow targets where the 10s deadline expires partway through the body; IDS/IPS or MTU issues truncating large frames.","solutions":["Check the wrapped error: reset/EOF means peer aborted mid-frame; deadline exceeded means slow response to a large request","Retry on a fresh connection; partial frames are never recoverable in place","Reduce request sizes or increase the read deadline when probing slow/loaded targets","Watch for repeated occurrences from one host — it may be dropping large packets (MTU/IDS interference)"],"exampleFix":"// before\n_, err = io.ReadFull(conn, buf)\nif err != nil {\n    return nil, nil, fmt.Errorf(\"failed to get SMB1 response about header: %s\", err)\n}\n// after\nn, err := io.ReadFull(conn, buf)\nif err != nil {\n    return nil, nil, fmt.Errorf(\"failed to get SMB1 response about header (got %d/%d bytes): %w\", n, size, err)\n}","handlingStrategy":"retry","validationCode":"// Large responses need more headroom; set a generous deadline before the call\n_ = conn.SetReadDeadline(time.Now().Add(15 * time.Second))\nraw, header, err := smb1GetResponse(conn)\nif err != nil && errors.Is(err, os.ErrDeadlineExceeded) {\n    // retry once with a fresh connection\n}","typeGuard":"func isShortRead(err error) bool {\n    return errors.Is(err, io.ErrUnexpectedEOF) || errors.Is(err, io.EOF)\n}","tryCatchPattern":"raw, _, err := smb1GetResponse(conn)\nif err != nil {\n    if isShortRead(err) || errors.Is(err, os.ErrDeadlineExceeded) {\n        conn.Close()\n        conn, err = reconnect(address) // fresh connection; partial frames are unrecoverable\n        if err != nil { return err }\n        return smb1GetResponse(conn)\n    }\n    return err\n}","preventionTips":["Set an adequate read deadline before requesting large SMB operations (NT Trans / Trans2 stages)","Never attempt to continue reading a partially received frame — reconnect instead","If one host repeatedly fails mid-frame, investigate MTU/fragmentation or IDS interference","Apply bounded retries (2-3) on fresh connections; endless retries on resets waste scan time"],"tags":["network","smb","short-read","timeout","netbios"],"backgroundTag":"broken-pipe","analyzedSha":"95cc12e753bf43de7004e5aef42a9ffba3934303","analyzedAt":"2026-09-06T17:07:30.094Z","contentChangedAt":"2026-09-06T17:07:30.094Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}