距离公开上线还剩十一天。设想一个假想的 B2B 开票平台:每个客户都有自己的独立工作区,会计人员以 CSV 文件批量上传账单,合作伙伴通过公开 API 接入,而客服人员在一个单独的控制台里工作,控制台上有一个“以客户身份登录”的按钮,方便排查问题。市场推广费用已经付出,上线日期已经公布,渗透测试被安排在最后一周——理由是“测一下已经做好的东西”。
第三天,测试人员报告:发票导出功能从请求参数中读取组织 ID,却从不与当前会话进行核对。只要改一个数字,就能看到另一家公司的银行信息和金额。与此同时,客服控制台允许员工进入任意工作区,既不留日志,也不需要第二因素认证。第一个问题一天就能修好;第二个问题需要重新设计角色体系,上线前根本来不及。
这是一个假设场景,并非真实项目的记录。但它提出的问题对创始人、产品负责人和安全负责人来说再真实不过:上线前究竟要测什么、什么时候测、测多深——又依据什么规则判断这个版本可以发布?下面我们来看,如何组织一次上线前渗透测试,让它的结果真正支撑决策,而不只是被归档进报告文件夹。
上线前渗透测试能带来什么,又不能带来什么
上线前渗透测试是一项经过授权、有时间限制的工作:专业人员在新产品中寻找可被利用的漏洞,并具体演示如何利用。如果测试发生在公开流量进入之前,使用与生产隔离的环境和合成数据,那么修复不会影响真实客户,合作伙伴集成也尚未依赖有缺陷的行为。带来时间和测试安全优势的是这些条件,而不是“上线前”这个标签本身。
CISA 的 Secure by Design(设计即安全)倡议强调,安全应当在设计阶段就内建,而不是在产品发布后再补上。渗透测试在这一逻辑中扮演的是检验角色:它展示设计决策在遇到一个专门寻找破绽的人时能否经受住考验。它无法替代安全设计。
边界最好一开始就讲清楚。渗透测试无法证明漏洞不存在。它提供的是在约定范围内、约定时间内、以约定访问级别获得的证据。一个被确认的发现说明攻击是可能的,但并不说明类似缺陷在其余代码中出现得有多频繁。反过来,如果两周测试没有发现任何严重问题,那也只意味着在已测试的场景中没有发现严重问题。
渗透测试不是认证、不是鉴证,也不是合规意见。正因如此,最好把它的结果当作风险决策的输入,而不是一枚“安全”的印章。
如何确定上线前渗透测试的范围
好的测试范围不是从一份 IP 地址清单开始的,而是从一个问题开始:这次发布中,产品里哪些路径是新增或改动过的?其中哪些一旦行为与设计不符就会带来危险?优先级取决于潜在影响和可达性;常见的深入检查对象包括身份认证、客户数据隔离、支付和个人数据处理、文件上传、公开 API 以及对第三方服务的调用。
内部服务面应当被明确列出。管理控制台、客服工具和运维内部接口可能拥有广泛权限,却仍可能因为“不是给客户用的”而被排除在范围之外。
资产、角色与租户
约定范围内的每一种角色——从匿名访客到超级管理员——都需要合适的测试账号或其他约定的测试方式。如果产品是多租户的,至少两个测试租户可以直接检验一个核心问题——一个客户能否看到或修改另一个客户的数据。关于租户隔离和计费角色如何影响测试范围,可以参阅我们关于 SaaS 公司渗透测试的文章。
不要低估“只读”功能。即使导出、报表、搜索和文档预览不修改业务对象,它们也可能披露他人的数据。只读状态本身并不等于低风险。
凭据分为两类,在测试范围中应当分开对待。如果相关登录流程配置了多因素认证,它保护的是人的交互式登录。服务账号、合作伙伴 API 密钥、集成令牌和云角色密钥不经过这种登录,对它们要问的是另一些问题:存放在哪里、拥有哪些权限、如何撤销和轮换。
攻击面与归属确认
在主动测试之前,先梳理实际的攻击面很有帮助:子域名、公开存储桶、测试环境、被“遗忘”的旧版 API。但发现了某个资产,并不意味着可以对它发起攻击。首先要确认它属于客户,并且客户有权授权对其进行测试。一个看起来像是你们的域名,可能属于承包商、前合作伙伴,甚至完全无关的陌生人。如何开展这类发现工作并对结果排定优先级,可以参阅我们关于外部攻击面评估的文章。
授权与测试规则
授权是测试范围的一部分,而不是走形式。测试必须由对范围内每一个系统都拥有权限的人书面批准。如果部分组件托管在云服务商处或由承包商运营,可能还要遵守他们自己的测试规则,有时需要单独取得同意。默认授权(“这毕竟是我们自己的服务”)是不够的。
测试规则(rules of engagement)中要写明:排除项、测试时间窗口、立即停止的条件、双方的紧急联系人,以及数据处理方式——测试人员可以看到什么、证据如何保存、谁能访问、何时删除。证据最好按最小化原则收集——只保留复现所需的内容,并对真实个人数据做脱敏处理。
如果变更路径已经清楚,但测试范围还没有确定,最好在下单之前就讨论清楚。你可以在渗透测试范围确认页面描述产品、角色和环境限制,我们会建议哪些边界和测试深度值得进一步讨论。
测试环境与生产环境:哪些结论可以迁移,哪些不能
上线前测试经常在接近生产的预发布环境中使用合成数据进行。当该环境确实与生产及外部集成隔离时,测试人员可以创建和删除对象、尝试有风险的场景,而不会直接影响真实客户。
但预发布环境的结果并不会自动适用于生产环境。生产环境中的反向代理或 WAF 配置可能不同,功能开关不同,云角色权限不同,库的版本也不同——反过来,预发布环境中可能有些检查为了“方便测试”而被关闭了。最好事先列出一份简短的差异清单,并判断其中哪些对安全有实质影响。
有时,在预发布环境测试之后,还值得在生产环境中做一次范围很窄、事先约定的检查——例如检查响应头、TLS 配置和内部服务路径的可达性——但不进行任何可能中断服务或修改数据的操作。
报告中的每一个结论都应附带这样的限定:“在此环境中、以此访问权限、在这些场景下”。这不是形式,而是测试所能主张的诚实边界。
测试深度:从黑盒到假定入侵
深度取决于测试人员掌握多少信息。黑盒测试类似外部攻击者的视角,但相当一部分时间会花在侦察上。灰盒测试——提供所有角色的账号和 API 文档——可以把更多可用时间用于授权逻辑和业务流程。白盒测试可以访问源代码和架构图,因而可能发现从外部在有限天数内无法触及的缺陷。
上线前的目标是在修复还不会影响客户的时候尽可能多地发现严重缺陷,因此,增加访问权限可以在相同测试窗口内提高深度。假定入侵(assume-breach)场景则不同:测试从事先约定的“已失陷”状态开始,例如一个普通员工账号或对单个容器的访问权限。这有助于了解攻击者能走多远。但这种测试并不能证明初始访问确实可以实现——它只是假设了这一点。
左右滑动查看对照
| 方法 | 模拟对象 | 上线前能带来什么 | 局限 |
|---|---|---|---|
| 黑盒 | 对系统一无所知的外部攻击者 | 对公开攻击面的真实视角 | 时间耗在侦察上,深层逻辑可能测试得较少 |
| 灰盒 | 拥有账号和文档的用户或合作伙伴 | 检验授权、租户隔离和业务流程 | 取决于所提供角色和文档的完整程度 |
| 白盒 | 可以访问代码和架构的审计人员 | 找到根本原因以及外部看不到的缺陷 | 需要就代码访问与保存达成约定 |
| 假定入侵 | 已经获得约定初始立足点的攻击者 | 评估影响和横向移动路径 | 不能证明初始访问是可能的 |
| 自动化扫描 | 针对已知问题的批量检查 | 覆盖面广、可重复,适合回归 | 单独使用时不能验证业务逻辑或复杂攻击链 |
灰盒对于发现业务逻辑滥用尤其重要:负数金额、重复使用折扣、跳过确认步骤、并发请求下的竞态条件。传统的模式型扫描器通常无法验证这类问题:单个请求在技术上可能有效,而缺陷存在于操作顺序的业务含义中。关于如何测试这类问题,可以参阅我们关于业务逻辑安全测试的文章。
方法论依据:WSTG、ASVS 与 Top 10
对于应用和 HTTP API 中适用的 Web 检查,OWASP Web Security Testing Guide(WSTG)可以提供方法论主干。可以请服务商事先说明:将覆盖 WSTG 的哪些章节,有意排除哪些章节,以及原因。在测试开始前,这份清单记录计划覆盖的内容;测试结束后,报告和测试记录还要另行说明实际检查了什么、哪些内容仍被排除。最好记录所用指南的版本——例如 4.2——这样一年之后仍能清楚工作依据的是哪个版本。
OWASP Application Security Verification Standard(ASVS)的用处则在于另一点:它描述了安全控制的可验证要求。在 5.0.0 版本中,ASVS 建议引用要求时加上版本前缀,例如 v5.0.0-1.2.5 这样的格式,因为编号会在不同版本之间变化。对于适用的 Web 控制,这使 ASVS 成为一种实用的验收标准语言:相关发现和通过的检查可以对应到具体要求。移动端、云、基础设施及其他工作需要各自明确的标准。
这里的边界同样适用。有范围限定的测试可以支持某项要求在已测试场景中得到满足,但不会让产品变成“通过 ASVS 认证”。
2025 年版 OWASP Top 10 是一份提升意识的文档,介绍 Web 应用最关键的风险。对上线而言,它是底线而不是上限:只检查 Top 10 各项标题的测试,明显比基于 WSTG 和 ASVS 构建的测试要窄。如果产品还包含移动客户端、LLM 功能或工业组件,就需要各自的专门方法——通用的 Web 检查清单无法替代它们。
有限时间投向哪里:弱点类别
测试时间总是有限的,合理的做法是按那些既危险、又在你的技术栈中可能出现的缺陷类别来分配时间。MITRE 发布了 2025 年版 CWE Top 25 Most Dangerous Software Weaknesses(最危险软件弱点 Top 25)。2025 年版与主榜单一同发布的,还有依据 CISA 已知被利用漏洞(KEV)目录编制的 CWE Top 10 KEV Weaknesses,以及“On the Cusp”榜单——那些差一点进入主榜单的弱点。
这里很容易误读。CWE 是对弱点类型的分类,而不是对某个具体产品被利用概率的评估。某个类别的位置反映的是具体榜单的方法和源数据:Top 25 使用已公开漏洞及其评分,KEV 榜单使用已知被利用漏洞目录中出现的类别。它并不说明你的产品存在该缺陷,也不表示该缺陷被利用的概率或攻击频率。应把这些榜单当作多个优先级信号之一,而不是预测。
CISA 在 Secure by Design 系列警报中讨论了如何从类别层面消除跨站脚本、操作系统命令注入和目录遍历,并与 FBI 联合发布了关于缓冲区溢出漏洞的警报。ASVS 中也有一项关于防范操作系统命令注入的要求。
实践上的结论是:测试范围中应明确写出,针对实际技术栈将如何检查上述每一类问题。如果产品调用系统工具来转换上传的文件——就测试命令注入和路径遍历。如果界面会渲染用户提供的 HTML——就测试跨站脚本和 CSP。如果技术栈中有 C 或 C++ 代码——就关注内存安全问题,CISA 在关于内存安全路线图的材料中专门讨论过这一点。
Web 与 API:会话、浏览器策略与默认安全
HTTP 作为协议是无状态的:每个请求本身都是独立的。会话状态是构建在它之上的——通过 Cookie、令牌和服务器端会话存储。这是一种普通且完全可行的设计,协议本身并不妨碍它。
但正因如此,会话管理、令牌的签发与撤销、Cookie 属性以及认证流程,始终是几乎所有 Web 产品和 API 的关键测试领域。错误不是出在协议本身,而是出在应用如何把一个请求与用户及其权限关联起来。
浏览器安全机制在上线前更容易配置,等到集成方已经依赖旧行为之后再引入就很麻烦。对它们需要准确理解,而不是只看名字。
Content Security Policy(CSP)规定页面可以从哪里加载脚本和其他资源,有助于发现和缓解跨站脚本和数据注入。CORS 决定浏览器是否允许来自另一个源的脚本读取响应。它不是服务器端的授权机制:请求仍然可能到达 API,服务器必须自己检查是谁在请求什么。Cross-Origin Resource Policy(CORP)允许资源所有者要求浏览器在 no-cors 请求中不要把资源内容交给其他源的页面;它并不能阻止请求被发送。Permissions Policy 限制页面代码对摄像头、地理位置等浏览器功能的访问。
基础的响应头配置可以自行检查,例如使用 MDN 为开发者和管理员提供的 HTTP Observatory。请在项目开始前完成这一步:修好基础响应头后,约定时间中可以有更多用于授权、租户隔离和流程滥用,不过服务商仍应验证范围内的相关配置。
CISA 还期望产品做到默认安全,并且多因素认证、日志记录和单点登录无需额外付费即可使用。上线前测试正是确认这些默认设置确实已启用并正常工作的好时机:第二因素不能通过其他登录流程绕过,日志记录了管理员和客服人员的操作,SSO 集成不会接受他人的断言。
从规划到复测
NIST SP 800-115 是一份关于信息安全测试与评估的技术指南,发布于 2008 年,取代了 SP 800-42。它把评估分为规划、执行和执行后三个阶段,其中执行后阶段包括分析发现、编写报告和制定缓解措施。该指南把漏洞扫描、渗透测试、安全评估和安全检查视为不同的活动。
这一区分在采购时很有用。自动化扫描提供覆盖面和可重复性;人工渗透测试则增加深度、对业务逻辑的理解,以及把小问题串联成真实攻击路径的能力。这份文档已有多年历史,因此它的规划思路最好与 OWASP 等现行 Web 方法结合使用。
在这些阶段之上,可以建立一个实用的循环,避免项目以一份没有下文的报告告终。
- 规划与授权按产品变更路径确定范围,取得有权限的所有者书面授权,约定测试规则、停止条件和发布标准——全部在测试开始前完成。
- 执行测试在接近生产的环境中按约定方法进行人工与自动化测试;严重问题立即通报,而不是等到最终报告。
- 分析与报告可复现的证据,尽量少含敏感数据,写明根本原因、适用的 CWE 类别,并仅对合适的 Web 控制引用带版本号的 ASVS 要求。
- 修复与复测团队修复根本原因;服务商在可比条件下重新验证修复,并记录具体复测了哪些内容。
- 发布决策负责的高管签署上线决定、已接受风险及其修复日期清单,以及下一次测试计划。
这个循环中有两个细节很容易被忽略。第一是即时通报渠道。如果第二天就发现了授权绕过,产品团队应当当天就知道,而不是三周后随报告一起得知。第二是破坏性操作的规则:任何可能中断服务或修改数据的操作,只有在测试规则中明确允许时才能进行。
发布就绪标准:阻断项、例外与剩余风险负责人
就绪标准必须在测试开始前定义,而不是等拿到报告之后。请事先回答三个问题:哪些严重级别会阻断发布;哪些问题可以带着有日期的修复计划和补偿性控制措施上线;由谁签署决定。
CISA 强调,产品安全的责任应当落在供应商最高管理层。在实践中,机构应事先指定适当层级的决策负责人;重大剩余风险由获授权的高管记录并接受,而不是留成一张悄悄躺在待办列表里的工单。NIST Cybersecurity Framework 2.0 并未规定必须做渗透测试,但它有助于把测试结果纳入整体风险管理流程——与治理、检测和响应并列。
左右滑动查看对照
| 发布标准 | 以什么证据支持 | 由谁确认 | 它不能证明什么 |
|---|---|---|---|
| 阻断性问题已关闭 | 修复后对原始场景及约定的相近变体进行复测并记录结果 | 测试服务商和产品负责人 | 未测试的路径中不存在类似缺陷 |
| 租户隔离有效 | 通过界面、API、导出和搜索尝试访问第二个测试租户的对象 | 测试服务商 | 数据模型今后变更后隔离仍然有效 |
| 特权控制台受控 | 检查角色、第二因素以及客服和管理员操作的日志记录 | 测试服务商和安全负责人 | 员工权限授予流程在实践中得到遵守 |
| 浏览器策略和响应头已配置 | 配置自查,并在生产环境中按约定的窄范围场景确认 | 运维团队 | 服务器正确地对跨源请求进行了授权 |
| 剩余风险被有意识地接受 | 签署的未关闭问题清单,附补偿性控制措施和日期 | 负责的高管 | 不跟进执行,风险也会在约定日期前消失 |
报告应当包含什么
一份有用的报告应为每个发现写明:严重级别、受影响资产、可复现的步骤和证据、在存在合适类别时对应 CWE 的根本原因、具体建议,以及针对适用 Web 控制的带版本号 ASVS 要求或其他技术标准。证据应当最小化并去标识化:如果保留了必要语境和可复现性,一张遮蔽银行信息的截图可能已经足够;完整数据导出并非为此所必需,反而会增加风险。请事先约定谁可以访问报告、报告保存多久。
修复应针对根本原因,而不是个别实例。MITRE 指出,理解常见的根本原因可以反馈到开发生命周期和架构规划中。如果导出功能没有检查对象归属,同样的模式也可能出现在其他接口中——因此修复共用的访问控制机制,比只修一个参数更可靠。
复测及其边界
复测确认的是:特定的阻断性问题在特定条件下已经关闭。它应记录重复了哪些场景、基于哪个构建版本、在哪个环境中进行。如果修复是在预发布环境中验证的,而推送到生产环境的是另一个构建版本,那么“问题已关闭”的结论只适用于预发布环境。如何让复测成为有说服力的证据,而不是一个“已修复”的勾选框,可以参阅我们关于渗透测试修复验证的文章。
时间上的取舍与上线之后
核心矛盾在于时间。测得太早,测到的是还会改变的功能;测得太晚,发现的问题就没有时间修复。一个实用的做法是:在发布功能集稳定下来后再测试,并事先在计划中为修复和复测预留出发布日期之前的时间窗口。这是规划上的决定,而不是硬性规定:只有在评估暴露面、权限、数据、潜在影响和变更规模之后,较轻量的检查才可能合理,不能只依据受众规模。
一次性的上线前测试只是某一天的快照。CISA 关于安全软件部署的指南呼吁在发布流程中建立稳健的测试和度量环节。上线之后,合理的做法是转向对已修复问题的回归检查、流水线中的自动化扫描,以及在真正影响安全的变更之后重新测试:新的角色模型、新的集成、认证机制的更换、新开放的 API。
这并不意味着每一次提交都需要一次付费渗透测试。如何把测试范围与具体变更联系起来,可以参阅我们关于变更触发式渗透测试的文章。
如何选择上线前渗透测试服务商
一旦范围、深度和就绪标准确定下来,选择服务商就变得简单了:所有方案都可以按同一套要求进行比较。CISA 在 Secure by Demand 指南中鼓励软件采购方向供应商提出具体、可验证的问题;同样的原则也适用于采购安全测试。
请每一位候选服务商给出实质性的回答。将覆盖 WSTG 的哪些章节,排除项如何记录?适用的 Web 发现和通过的检查是否会引用带版本号的 ASVS 要求,合适的弱点是否会映射到 CWE,其他范围又采用什么标准?授权、测试规则、停止条件和紧急联系人如何处理?测试数据以及发现的敏感信息如何保存和删除?是否包含复测,在修复后多长时间内进行?人工工作与自动化扫描的比例是多少?能否提供一份去标识化的样例报告,以便评估证据和建议的质量?
团队的资质和推荐应当独立核实,而不是只看营销材料。警示信号并不难识别:没有讨论范围就给出报价、把扫描器输出当作渗透测试、承诺宣布产品“没有漏洞”、对谁授权测试每个系统含糊其辞。
如果你需要一个可以深入讨论这些问题的对象,可以在范围确认页面描述你的产品和限制,或者了解 Pentest.red 的渗透测试是如何开展的。我们可以一起讨论,针对你的这次发布,哪些边界、深度和证据形式是合理的。如果你的项目需要具有法律效力的鉴证或审计师的合规意见,那是一项单独的工作,需要相应资质的评估,渗透测试无法替代它。
结语:一个可以解释的发布决定
上线前渗透测试在被纳入发布流程时能够支持发布决策,而不是在最后一周临时加上去。范围依据产品中变更过的、有风险的路径来确定,授权来自有权给予授权的人,深度根据任务来选择,优先级则遵循与你的技术栈相关的弱点类别。如果发现需要采取行动的问题,工作应继续到约定的根本原因修复和复测;发布决定则另行记录未关闭问题、补偿性控制,以及获授权决策负责人接受剩余风险的决定。
这样的结果有着诚实的边界:它讲的是被测试的环境、被授予的访问权限和已覆盖的场景。但它可以向工程师、管理层乃至日后的客户解释清楚——这正是证据与安全声明之间的区别。
PENTEST.RED
讨论渗透测试范围与报价
首先明确系统、访问权限、限制条件和预期证据。
本文以深入研究为基础,经过编辑整理,注重清晰表达和实际应用。