{"record":{"id":"72ad0b20ef11125a","repo":"shadow1ng/fscan","slug":"ms17010-padding-check-failed","errorCode":null,"errorMessage":"ms17010_padding_check_failed","messagePattern":"ms17010_padding_check_failed","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"plugins/services/ms17010.go","lineNumber":198,"sourceCode":"\t\treturn \"\", fmt.Errorf(\"%s: %w\", i18n.GetText(\"ms17010_aes_cipher_failed\"), err)\n\t}\n\n\tif len(cryptedBytes) < aes.BlockSize {\n\t\treturn \"\", fmt.Errorf(\"%s\", i18n.GetText(\"ms17010_ciphertext_too_short\"))\n\t}\n\n\tmode := cipher.NewCBCDecrypter(block, keyBytes[:aes.BlockSize])\n\tmode.CryptBlocks(cryptedBytes, cryptedBytes)\n\n\t// 移除PKCS7填充\n\tpadding := int(cryptedBytes[len(cryptedBytes)-1])\n\tif padding > len(cryptedBytes) || padding > aes.BlockSize {\n\t\treturn \"\", fmt.Errorf(\"%s\", i18n.GetText(\"ms17010_invalid_padding\"))\n\t}\n\n\tfor i := len(cryptedBytes) - padding; i < len(cryptedBytes); i++ {\n\t\tif cryptedBytes[i] != byte(padding) {\n\t\t\treturn \"\", fmt.Errorf(\"%s\", i18n.GetText(\"ms17010_padding_check_failed\"))\n\t\t}\n\t}\n\n\treturn string(cryptedBytes[:len(cryptedBytes)-padding]), nil\n}\n\n// 默认AES解密密钥 (从legacy代码复制)\nvar defaultKey = \"0123456789abcdef\"\n\n// SMB协议加密的请求数据 (从原始MS17010.go复制)\nvar (\n\tnegotiateProtocolRequestEnc  = \"G8o+kd/4y8chPCaObKK8L9+tJVFBb7ntWH/EXJ74635V3UTXA4TFOc6uabZfuLr0Xisnk7OsKJZ2Xdd3l8HNLdMOYZXAX5ZXnMC4qI+1d/MXA2TmidXeqGt8d9UEF5VesQlhP051GGBSldkJkVrP/fzn4gvLXcwgAYee3Zi2opAvuM6ScXrMkcbx200ThnOOEx98/7ArteornbRiXQjnr6dkJEUDTS43AW6Jl3OK2876Yaz5iYBx+DW5WjiLcMR+b58NJRxm4FlVpusZjBpzEs4XOEqglk6QIWfWbFZYgdNLy3WaFkkgDjmB1+6LhpYSOaTsh4EM0rwZq2Z4Lr8TE5WcPkb/JNsWNbibKlwtNtp94fIYvAWgxt5mn/oXpfUD\"\n\tsessionSetupRequestEnc       = \"52HeCQEbsSwiSXg98sdD64qyRou0jARlvfQi1ekDHS77Nk/8dYftNXlFahLEYWIxYYJ8u53db9OaDfAvOEkuox+p+Ic1VL70r9Q5HuL+NMyeyeN5T5el07X5cT66oBDJnScs1XdvM6CBRtj1kUs2h40Z5Vj9EGzGk99SFXjSqbtGfKFBp0DhL5wPQKsoiXYLKKh9NQiOhOMWHYy/C+Iwhf3Qr8d1Wbs2vgEzaWZqIJ3BM3z+dhRBszQoQftszC16TUhGQc48XPFHN74VRxXgVe6xNQwqrWEpA4hcQeF1+QqRVHxuN+PFR7qwEcU1JbnTNISaSrqEe8GtRo1r2rs7+lOFmbe4qqyUMgHhZ6Pwu1bkhrocMUUzWQBogAvXwFb8\"\n\ttreeConnectRequestEnc        = \"+b/lRcmLzH0c0BYhiTaYNvTVdYz1OdYYDKhzGn/3T3P4b6pAR8D+xPdlb7O4D4A9KMyeIBphDPmEtFy44rtto2dadFoit350nghebxbYA0pTCWIBd1kN0BGMEidRDBwLOpZE6Qpph/DlziDjjfXUz955dr0cigc9ETHD/+f3fELKsopTPkbCsudgCs48mlbXcL13GVG5cGwKzRuP4ezcdKbYzq1DX2I7RNeBtw/vAlYh6etKLv7s+YyZ/r8m0fBY9A57j+XrsmZAyTWbhPJkCg==\"\n\ttransNamedPipeRequestEnc     = \"k/RGiUQ/tw1yiqioUIqirzGC1SxTAmQmtnfKd1qiLish7FQYxvE+h4/p7RKgWemIWRXDf2XSJ3K0LUIX0vv1gx2eb4NatU7Qosnrhebz3gUo7u25P5BZH1QKdagzPqtitVjASpxIjB3uNWtYMrXGkkuAm8QEitberc+mP0vnzZ8Nv/xiiGBko8O4P/wCKaN2KZVDLbv2jrN8V/1zY6fvWA==\"\n\ttrans2SessionSetupRequestEnc = \"JqNw6PUKcWOYFisUoUCyD24wnML2Yd8kumx9hJnFWbhM2TQkRvKHsOMWzPVfggRrLl8sLQFqzk8bv8Rpox3uS61l480Mv7HdBPeBeBeFudZMntXBUa4pWUH8D9EXCjoUqgAdvw6kGbPOOKUq3WmNb0GDCZapqQwyUKKMHmNIUMVMAOyVfKeEMJA6LViGwyvHVMNZ1XWLr0xafKfEuz4qoHiDyVWomGjJt8DQd6+jgLk=\"\n\n\t// SMB协议解密后的请求数据","sourceCodeStart":180,"sourceCodeEnd":216,"githubUrl":"https://github.com/shadow1ng/fscan/blob/95cc12e753bf43de7004e5aef42a9ffba3934303/plugins/services/ms17010.go#L180-L216","documentation":"After reading the PKCS7 padding length, aesDecrypt verifies every padding byte equals the padding value; a mismatch raises \"ms17010_padding_check_failed\". This is the standard PKCS7 integrity check and almost always indicates the data decrypted to garbage (wrong key/IV) or was not PKCS7-padded.","triggerScenarios":"aesDecrypt succeeds at decryption but the trailing bytes are not uniform: wrong key, wrong fixed IV (keyBytes[:16]), non-PKCS7 padding (zero padding, ANSI X9.23), or truncated/modified ciphertext.","commonSituations":"Migrating payloads encrypted by other tools with different padding or IV conventions, key rotation on the producer side, or man-in-the-middle/corrupted storage flipping bytes in the final blocks.","solutions":["Double-check the key and IV derivation on both sides; a single wrong byte in the last block trips this check.","Confirm the encryptor uses PKCS7; if it uses zero-padding, strip manually instead of using this validator.","Add a MAC (e.g. HMAC or use AES-GCM) to distinguish corruption from padding errors.","Retry with the exact original key material if a KDF/encoding step (hex vs raw) may have been skipped."],"exampleFix":"// before: silent assumption of PKCS7\nplain, err := aesDecrypt(payload, key)\n// after: inspect the real padding when diagnostics are needed\nraw, _ := base64.StdEncoding.DecodeString(payload)\nlog.Printf(\"last block bytes: %x\", raw[len(raw)-aes.BlockSize:])\nplain, err := aesDecrypt(payload, key)\nif err != nil && strings.Contains(err.Error(), \"padding\") {\n    return fmt.Errorf(\"wrong key or non-PKCS7 padding: %w\", err)\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"plain, err := aesDecrypt(payload, key)\nif err != nil {\n    if strings.Contains(err.Error(), \"padding_check_failed\") {\n        return fmt.Errorf(\"wrong key or non-PKCS7 padding: %w\", err)\n    }\n    return err\n}","preventionTips":["Keep key material in sync between producer and consumer (version keys)","Confirm the encryptor's padding scheme is PKCS7","Test decrypt with a known-good sample on every key change"],"tags":["go","aes","pkcs7","padding","crypto","ms17010"],"backgroundTag":"invalid-argument-value","analyzedSha":"95cc12e753bf43de7004e5aef42a9ffba3934303","analyzedAt":"2026-09-06T17:07:30.094Z","contentChangedAt":"2026-09-06T17:07:30.094Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}