JGoyd/m365-mime-type-confusion
GitHub: JGoyd/m365-mime-type-confusion
该项目披露了 Microsoft 365 Exchange Online 中一处 MIME 类型混淆漏洞,允许二进制内容伪装为通用文件流绕过图片安全扫描并在移动端静默渲染。
Stars: 1 | Forks: 0
# M365 跨租户 MIME 类型混淆 | 不可见的内联图片投递绕过
**[状态:已验证披露]**
## 摘要
Microsoft 365 Exchange Online 中的一处 MIME 类型混淆漏洞,允许任何经过身份验证的租户账号跨租户投递二进制内容,该内容能绕过所有针对图片的安全扫描,由 Microsoft 自有的 ARC 密钥进行加密签名,并在移动设备上作为邮件签名不可见地渲染——同时在桌面客户端上却显示为可见的 `.bin` 附件。
该发现于 2026-04-01 在野外被观察到,源自一个被盗用的范德堡大学 (Vanderbilt University) M365 账号(Vanderbilt IT 工单 #86705)。
## 影响
- 任何被盗用的 M365 账号都可以通过 Microsoft 的安全管道投递内容,而无需接受针对图片的检查。不需要管理员权限或特殊权限。
- Defender for Office 365 根据声明的 `Content-Type` (`application/octet-stream`) 进行路由,而不是根据实际的文件字节(有效的 PNG)。14 条反垃圾邮件规则对观察到的投递进行了评估——全部顺利通过。
- 在 iOS 上,该二进制文件通过 ImageIO/CoreGraphics 作为签名图片静默渲染——这正是 FORCEDENTRY (CVE-2021-30860) 所针对的同一解析管道——且不向用户显示任何附件指示。
- 完整图片(894x670 RGBA = 解码后 2.4 MB)被处理为 96x72 的显示尺寸——通过未扫描的图片解析器实现了 86.7 倍的解码放大。
- Microsoft 的 DKIM、ARC (`arcselector10001`)、SPF、DMARC 和 `CrossTenant-AuthAs: Internal` 均为该投递提供信任担保。
自评 CVSS:`CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N` (8.7 高危)。
相关 CWE:CWE-345、CWE-436、CWE-693、CWE-116。
## 类型混淆
该附件被声明为通用二进制文件,但实际上是一个有效的 PNG 图片:
```
Content-Type: application/octet-stream
Content-Disposition: inline; filename="img-558cec93-b715-4e03-9dd1-77b9d1ad276f.bin"
Content-ID: <71286496-9DC4-4208-B54A-B40A45E951B8>
```
HTML 正文在 `
` 内部引用了它:
```
```
**扫描与渲染产生了分歧:**
| 路径 | 解析方式 | 结果 |
|------|---------------|--------|
| Defender(服务端) | `Content-Type: application/octet-stream` | 仅进行二进制检查。无图片扫描。**安全。** |
| iOS Mail(客户端) | `cid:` 解析 -> 字节嗅探 -> PNG 魔数 | ImageIO/CoreGraphics 完整解码。作为签名图片渲染。**未显示附件。** |
## 双重渲染行为
| 平台 | 用户所见内容 |
|----------|-------------------|
| 桌面 / 网页客户端 | 一个 `.bin` 附件(87.77 KB)——可见,可下载 |
| iOS Mail / 移动端 | 无附件——图片静默渲染为 1"x0.75" 的签名徽标 |
## 解码放大
图片尺寸为 894x670 像素(8 位 RGBA),但渲染尺寸为 96x72 像素:
| 指标 | 数值 |
|--------|-------|
| 解码后的像素缓冲区 | 2,395,920 字节 |
| 显示尺寸 | 27,648 字节 |
| 放大倍数 | **86.7 倍** |
完整的 2.4 MB 缓冲区由 ImageIO/CoreGraphics(与 FORCEDENTRY (CVE-2021-30860) 针对的解析管道相同)进行处理,仅仅是为了一个 1 英寸的签名徽标。在整个过程中没有发生任何针对图片的特定扫描。
## 观察到的投递
于 **2026-04-01 01:05:35 UTC** 通过 Exchange Online 投递。
| 字段 | 值 |
|-------|-------|
| 网络邮件 ID | `6126db63-c140-41d2-df30-08de8f8ac828` |
| 发送租户 GUID | `ba5a7f39-e3be-4ab3-b450-67fa80faecad` |
| 发件组织 | `vanderbilt.edu` |
| 附件 SHA-256 | `a36cd36e56057922fb2c1d80ec7a51661602d9b9eb7afefb4dfa6853acae149f` |
信任链:DKIM 通过 (`d=vanderbilt.edu`, `s=selector1`, 2048 位)、SPF 通过、DMARC 通过 (`p=reject`)、ARC 通过 (`arcselector10001`, `d=microsoft.com`)、`CrossTenant-AuthAs: Internal`、`SenderADCheck: 1`。
Defender 裁决:`SCL:1 / SFV:NSPM / CAT:NONE / BCL:0`。评估了 14 条反垃圾邮件规则。均未标记该附件。
传输:100% Microsoft 基础设施——`SJ0PR08MB8349` -> `LV3PR08MB9463` -> `SJ2PR03CU001 [52.101.43.57]` -> 收件人。
## 平台行为
| # | 行为 | 组件 |
|---|----------|-----------|
| 1 | 内联图片被打包为带有 `.bin` 文件名的 `application/octet-stream` | Outlook 移动端撰写 |
| 2 | 声明的 `Content-Type` 未针对实际文件字节进行验证 | Exchange Online 传输 |
| 3 | 对内联引用的 `octet-stream` 没有进行针对图片的检查 | Defender for Office 365 |
| 4 | `CrossTenant-AuthAs: Internal` 跨越租户边界应用 | Exchange Online 路由 |
| 5 | `arcselector10001` ARC 密钥为投递封签 | Exchange Online ARC 签名 |
| 6 | 被盗用的账号通过 `SenderADCheck` 继承完全信任 | Exchange Online 信任模型 |
## 检测
### YARA
```
rule M365_MIME_Type_Confusion_Inline {
meta:
description = "M365 email with inline image declared as octet-stream"
reference = "MSRC 112639"
strings:
$mime1 = "Content-Type: application/octet-stream" ascii
$mime2 = "Content-ID:" ascii
$mime3 = "multipart/related" ascii
$cid = /src="cid:[A-Za-z0-9\-]+"/ ascii
$png = { 89 50 4E 47 0D 0A 1A 0A }
$m365 = "X-MS-Exchange-CrossTenant" ascii
condition:
$mime1 and $mime2 and $mime3 and $cid and $png and $m365
}
```
### Exchange Online 传输规则
**条件:** 邮件头包含 `application/octet-stream` + 正文包含 `cid:` + 邮件头包含 `multipart/related`
**操作:** 隔离或重定向至安全团队
## 验证
每一项主张都可以使用 Python 3 标准库从原始 `.eml` 文件中重现。Microsoft 在其服务器上持有相同的邮件字节,可通过上述网络邮件 ID 和租户 GUID 进行交叉比对。
## 之前的隐写术声明
最初的 MSRC 提交提到了载体 PNG 透明像素中的隐写有效载荷。字节级分析证实,所有 474,890 个透明像素都包含统一的全白 RGB (255,255,255),熵为零。该提取方法无法从投递的文件中重现。该声明已撤回。MIME 类型混淆的发现仅凭 `.eml` 文件即可独立验证。
## 披露时间线
| 日期 | 事件 |
|------|-------|
| 2026-03-31 | 在野外观察到来自被盗用范德堡大学 M365 账号的投递 |
| 2026-04-01 | 通知 Vanderbilt IT 安全部门(工单 #86705) |
| 2026-04-08 | 提交 MSRC Case 112639。同日提供包含 .eml 文件和验证步骤的更新 1。 |
| 2026-04-09 | MSRC 确认已指派评估工程师 |
| 2026-04-10 | MSRC 请求删除公开帖子;在 2.5 小时内完成配合 |
| 2026-04-13 | 发布防御性公告(检测指南,无漏洞利用代码) |