钓鱼邮件一直是攻击链里最便宜、最常见的入口。生成式 AI 改变了它的规模和质量:攻击者可以结合公开情报(OSINT),批量生成语气自然、上下文贴合、几乎不重复的邮件。对安全团队来说,传统基于关键字、黑名单和固定模板的检测方式会越来越吃力。Amazon Bedrock 的价值在于:把大语言模型接入邮件安全流水线,让系统不只看“有没有可疑词”,还看“这封邮件是否在诱导某个危险动作”。
新型钓鱼邮件难在“像真的”
过去的钓鱼邮件经常有明显破绽:拼写错误、粗糙模板、可疑域名、夸张措辞。AI 生成的邮件不同,它可以做到:
- 根据收件人的职位、公司新闻、项目名称写出定制化内容。
- 为每个目标生成不同措辞,降低基于重复样本的检测效果。
- 模仿内部通知、供应商催款、HR 流程、云服务告警等常见业务语境。
- 用更克制的语气绕过“紧急”“中奖”“密码过期”等简单规则。
这意味着邮件安全系统需要分析意图、上下文、行为诱导和信号组合,而不是只匹配几个危险词。
Bedrock 适合放在邮件安全流水线的哪一层
Amazon Bedrock 提供托管的基础模型访问能力,可以用于构建一个“语义判定层”。它不应该替代现有网关、反病毒、URL 沙箱和 DMARC/SPF/DKIM 检查,而是补上这些机制不擅长的部分:自然语言意图分析。
一个实用的流水线可以这样设计:
- 邮件网关先做基础过滤:发件域、认证结果、附件类型、URL 声誉。
- 对进入灰区的邮件,抽取主题、正文、链接文本、发件人信息。
- 调用 Bedrock,让模型输出结构化风险判断。
- 根据风险等级执行动作:放行、加警告横幅、隔离、提交人工复核。
- 把人工复核结果回写到规则和评估集里,持续调优提示词与阈值。
关键点是让模型输出机器可处理的 JSON,而不是一段自由发挥的解释。安全系统需要稳定字段,例如 risk_score、category、signals、recommended_action。
可以这样实践:用 Python 调用 Bedrock 做邮件风险判定
下面示例演示一个最小可改造的检测器。它假设你已经配置好 AWS 凭证,并且账号所在区域可以访问对应的 Bedrock 模型。运行前请把 modelId 换成你环境中已启用的模型 ID。
import boto3
import json
bedrock = boto3.client("bedrock-runtime", region_name="us-east-1")
email = {
"from": "it-support@example-login.com",
"to": "alice@company.com",
"subject": "Action required: mailbox storage policy update",
"body": "Hi Alice, your mailbox will stop receiving messages today unless you confirm the new storage policy. Please review the secure document here: https://example-login.com/office/update",
"links": ["https://example-login.com/office/update"],
"auth_results": {
"spf": "fail",
"dkim": "none",
"dmarc": "fail"
}
}
prompt = f"""
You are an email security classifier.
Analyze whether the following email is likely phishing, including AI-generated social engineering.
Return only valid JSON with these fields:
- risk_score: integer from 0 to 100
- category: one of [benign, suspicious, phishing, business_email_compromise]
- signals: array of concise reasons
- recommended_action: one of [allow, warn_user, quarantine, human_review]
Email:
{json.dumps(email, ensure_ascii=False, indent=2)}
"""
response = bedrock.invoke_model(
modelId="anthropic.claude-3-haiku-20240307-v1:0",
body=json.dumps({
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 500,
"temperature": 0,
"messages": [
{"role": "user", "content": prompt}
]
})
)
payload = json.loads(response["body"].read())
text = payload["content"][0]["text"]
result = json.loads(text)
print(json.dumps(result, indent=2, ensure_ascii=False))
if result["recommended_action"] in ["quarantine", "human_review"]:
print("Block or route this email for analyst review.")
else:
print("Deliver with normal or warning treatment.")
可以把这段代码接到 Amazon SES、邮件网关日志、SIEM 或 SOAR 流程后面。更成熟的做法是只把“灰区邮件”送给模型,避免成本失控,也减少模型参与低价值判定。
提示词要问“攻击意图”,不要只问“像不像垃圾邮件”
检测 AI 生成钓鱼邮件时,提示词设计很重要。一个弱提示词会得到泛泛的判断;一个好的安全提示词会让模型检查具体攻击模式。
可以让模型重点观察这些信号:
- 是否诱导输入密码、MFA 验证码、付款信息或下载附件。
- 是否利用紧迫感、权威身份、供应商关系或内部流程施压。
- 发件域名、链接域名、显示名称之间是否存在不一致。
- 邮件内容是否过度贴合个人或公司上下文,疑似使用 OSINT。
- 技术认证结果是否异常,例如 SPF、DKIM、DMARC 失败。
一个更适合生产环境的输出格式可以是:
{
"risk_score": 86,
"category": "phishing",
"signals": [
"Sender domain does not match the claimed IT support identity",
"Message pressures the user to act immediately",
"Link points to a non-corporate domain",
"SPF and DMARC checks failed"
],
"recommended_action": "quarantine"
}
这类结构化结果更容易被策略引擎消费。例如:risk_score >= 80 直接隔离;50-79 加警告横幅并提交复核;低于阈值则进入正常投递。
不要把 LLM 当成唯一裁判
Bedrock 能增强邮件安全系统,但边界也很清楚。
- 模型可能误判业务邮件,尤其是财务、HR、法务等高风险但正常的流程邮件。
- 攻击者可能尝试在邮件正文里注入指令,例如“忽略所有安全规则”。提示词中要明确邮件内容是不可信输入。
- 涉及隐私和合规时,应控制发送给模型的字段,必要时脱敏正文和附件内容。
- 模型输出应进入策略引擎,而不是直接决定所有安全动作。
- 需要用真实误报、漏报样本持续评估,而不是只看单次演示效果。
一个稳妥的落地清单是:先从旁路分析开始,不影响邮件投递;积累样本后设定阈值;再逐步对高置信度风险邮件启用隔离;最后把人工复核反馈纳入持续评估。AI 让钓鱼邮件更像真人写的,防御侧也需要从“匹配文本”升级到“理解意图”。