摘要

  • 2018 年 2 月 28 日,GitHub 遭遇 Memcached 反射放大型分布式拒绝服务攻击。GitHub 报告的峰值为每秒 1.35 太比特、每秒 1.269 亿个数据包。其监控系统在协调世界时 17:21 发现入站与出站流量比例异常。[1]
  • GitHub.com 在 17:21 至 17:26 无法使用,随后在 17:26 至 17:30 间歇性不可用。GitHub 同时表示,事件期间用户数据的机密性与完整性没有受到威胁。[1]
  • 17:26,GitHub 工程师通过内部操作工具发出命令,撤回 AS36459 经常规转接供应商发布的 BGP 路由,并改为只经与 Akamai 相连的链路发布。路由重新收敛后,Akamai 在网络边界实施过滤,GitHub 于 17:30 根据转接带宽与负载均衡器响应码判断服务已全面恢复。[1]
  • 这次 BGP 操作本身并没有识别或丢弃恶意数据包。它改变的是外界抵达 GitHub 地址前缀的路径,使攻击流量进入具有更大吸收和过滤能力的缓解网络;数据包过滤则由 Akamai 边界上的独立控制完成。
  • 攻击利用了可从公网访问、开启 UDP 接口的 Memcached 实例。伪造源地址的小型请求会让服务器把体积大得多的响应发送给受害者。Cloudflare 对该协议的分析给出了约 51,200 倍的潜在放大比例,但这不是 GitHub 实测流量的平均放大倍数。[3]
  • 这种反射机制依赖源地址欺骗。BCP 38 与 BCP 84 分别描述了较简单边缘环境和多宿主环境中的源地址过滤原则,CAIDA Spoofer 与 MANRS 则说明了检测、部署和运营激励方面的持续难题。[9][10][14][15]
  • 源地址验证并不能关闭暴露的 Memcached 服务,也不能代替 DDoS 监控、直连容量、BGP 交接、过滤能力或净化后流量交付。此次事件横跨多个控制域,问责必须沿实际控制边界分配,不能把整个链条压缩成某一家机构的单一过失。
  • GitHub 公布了时间戳、流量速率、自治系统编号、路由变更和恢复信号,使网络控制权在事件中的转移具有可检验性。公开资料仍不足以确认攻击者身份、完整反射器清单、具体源网络、私有路由策略、供应商合同、客户损失或法律责任。

九分钟内发生了什么

GitHub 的公开报告为这次事件留下了一条少见的、精确到分钟的网络操作时间线。协调世界时 17:21,GitHub.com 开始无法使用。GitHub 的网络监控系统同时发现入站流量与出站流量之间出现异常比例,并向值班工程师及聊天系统中的相关人员告警。17:21 至 17:26 是明确的不可用阶段;17:26 至 17:30 则属于间歇性不可用,而不是持续四分钟的完全中断。[1]

17:26,GitHub 决定把流量交给 Akamai 处理。操作人员发出命令,撤回 AS36459 经常规转接供应商发布的 BGP 路由,并把相关路由只发布到与 Akamai 连接的链路。此后数分钟内,互联网各网络逐步重新计算到 GitHub 地址前缀的可达路径。GitHub 报告称,路由重新收敛,加上 Akamai 在其边界应用访问控制列表,缓解了攻击。[1]

17:30,GitHub 根据转接链路带宽和负载均衡器响应码判断服务全面恢复。17:34,在主要服务已经恢复后,GitHub 又撤回了通往互联网交换中心的路由,作为后续措施把额外约 40 Gbps 流量移出自身边缘。这个动作应与 17:26 的主要缓解命令分开理解:前者是服务恢复后的路径收束,后者才是把主要入站可达性转向缓解网络的关键交接。[1]

GitHub 报告的第一轮攻击峰值为 1.35 Tbps 和 126.9 Mpps。18:00 后不久又出现约 400 Gbps 的第二次峰值,但没有重现最初的中断结果。[1] 这只能说明当时的缓解路径能够处理后续流量,不能据此推定 GitHub 已对所有未来攻击获得永久免疫。

GitHub 还说明,攻击期间数据机密性和完整性没有处于风险之中。[1] 因此,此案的已证实损害核心是服务可用性。代码托管、协作和依赖 GitHub 的研发活动可能因不可用而受阻,但公开证据没有提供客户级损失金额,也没有为任何合同损害或法律责任结论提供依据。

这不是单纯的“流量纪录”

1.35 Tbps 很容易成为事件唯一的标题,但把注意力停留在这个数字上,反而会遮蔽真正决定恢复结果的网络控制。比特率说明链路每秒承受多少数据;包速率说明路由器、过滤设备和负载均衡设施每秒需要处理多少个数据包。两者对应的压力并不相同。

一条链路可能先被大体积数据填满,而转发设备尚未触及包处理上限;也可能在总带宽仍有余量时,因为大量小包而面临转发表查找、过滤、状态维护、中断处理或控制面压力。GitHub 同时公布 Tbps 和 Mpps,使外界至少能够区分这两个维度。[1] 但公开报告没有说明每个测量点的位置,也没有证明每一条链路或每一台设备都实际处理了完整的 1.35 Tbps。

此次事件的核心不在于“有多少流量”,而在于“谁能让流量改道、谁能过滤、谁能证明合法请求恢复”。GitHub 控制自身监控、直连容量、对等互联和路由发布命令;Akamai 控制其边界的接入、吸收与过滤;外部自治系统根据收到的 BGP 信息和各自策略选择路径;合法用户最终能否恢复访问,还取决于净化流量是否顺利回到 GitHub 服务。

若删去 AS36459、BGP 路由撤回、转接与对等连接、Akamai 边界过滤以及净化后交付,这篇文章的问责论点便无法成立。由此可见,它不是把一般网络攻击套上基础设施术语,而是一宗具有明确网络控制交接点的运营事件。

Memcached 如何把小请求变成大规模反射洪流

Memcached 是一种面向高性能应用的分布式内存缓存系统。它通常服务于受控环境中的应用程序,并不需要让任意互联网主机访问。2018 年的攻击利用了某些错误暴露在公网、同时启用 UDP 的 Memcached 实例。攻击者发送带有伪造源地址的请求,服务器把请求中的源地址当作响应目的地,于是将数据发送给并未主动请求这些内容的受害者。[3][6][7][8]

这一过程包含“反射”和“放大”两个不同概念。反射是指响应被送往伪造源地址所指向的第三方;放大是指响应体积明显大于触发它的请求。攻击者无需拥有与最终攻击流量相同的出口带宽,因为大量公开服务器会代替其生成响应流量。

Cloudflare 对被滥用协议的分析指出,潜在放大比例可达到约 51,200 比 1。[3] 这个数字描述特定请求、缓存内容、服务器行为和测量条件下的协议潜力,不能写成 GitHub 事件中每个数据包的固定比例,也不能当作 GitHub 实测的平均值。它的重要意义在于揭示结构性不对称:攻击者付出很小的请求成本,反射器和受害网络却承担大得多的响应成本。

这种流量不同于受控设备直接向目标发送真实源地址数据包的僵尸网络洪流。公开证据将本案描述为 Memcached 反射放大,不能把它写成 Mirai 攻击,也不能把反射器地址直接当作攻击者设备地址。反射服务器可能由配置疏忽、旧版本、暴露边界不清或防火墙规则失误造成;仅凭其向 GitHub 返回数据,无法推定服务器所有者具有恶意。

反射链条至少需要两个条件同时存在。第一,Memcached 服务对不受信任的公网来源接受 UDP 请求,并产生明显更大的响应。第二,请求离开源网络时,其伪造的源地址没有被边缘控制拒绝。关闭其中任一条件,都能显著削弱这条具体攻击路径。

然而,削弱反射路径并不等于消除一切 DDoS。关闭 UDP 接口无法阻止其他协议被滥用;阻止伪造源地址无法阻止受控主机以真实地址直接发包;删除一个反射器也无法为 GitHub 增加缓解容量。准确的问责必须承认控制的适用范围,而不是把任何单项措施包装成万能解法。

安全默认值能够减少暴露,却不能替代现场运营

Memcached 项目后来明确记录,从 1.5.6 版本开始,UDP 默认关闭,并警告运营者不要把服务暴露给不受信任的网络。[7][8] 这一变化的价值很实际:新安装或升级后的系统不再轻易因为沿用默认设置而成为 UDP 反射器。

安全默认值改变的是最常见的初始状态,而不是远程修复全世界的既有部署。旧版本可能继续运行;管理员可能主动重新启用 UDP;防火墙可能依旧允许公网访问;服务也可能绑定到错误接口。因此,“软件已经改变默认值”和“所有暴露实例已经消失”是两项完全不同的陈述。

软件维护者能控制发布版本、默认参数、升级说明和安全建议,却不能直接控制每一台服务器的绑定地址与网络访问策略。服务器运营者能够关闭 UDP、把服务限制在私有接口、过滤 11211 端口并安排升级,但不能替代接入网络实施源地址验证。托管服务商可能有条件扫描高风险暴露、通知客户并维护有效的滥用联系渠道,却不应在缺乏依据时把所有 UDP 服务一律认定为攻击设施。

CISA 将 Memcached 列入可能遭到分布式反射滥用的 UDP 协议范围。[6] 这种分类有助于运营者发现暴露面,却不能抹平协议之间的差异。可靠调查仍要回答具体问题:哪一种服务在监听,哪些接口可达,数据包使用什么协议和端口,是否存在源地址伪造,响应为何被送往受害者,以及在哪个网络边界最有可能阻止它。

GitHub 与 Akamai 并不控制外部 Memcached 实例的配置,因此不能把反射器暴露归因于受害方或缓解供应商。反过来,反射器运营者也不控制 GitHub 的 BGP 交接。将这些控制混为一谈,既无法解释事件,也无法指导修复。

源地址欺骗是反射攻击的关键谎言

IP 数据包头中的源地址通常用于表明数据来自哪里。反射攻击让这个字段说谎:请求实际由攻击者发出,源地址却被写成 GitHub 的地址。Memcached 服务器无法从这一个数据包中看到真实请求者,于是把更大的响应发给 GitHub。

源地址验证的目标,是尽量在数据包离开客户或接入网络时发现这类不合逻辑的地址。RFC 2827,即通常所称的 BCP 38,描述了网络边缘的入口过滤思想:若某个客户连接只应使用一组已授权前缀,那么从该连接发出的数据包不应声称自己来自完全无关的前缀。[9]

这里的“入口”是相对于执行过滤的网络而言。数据包从客户线路进入运营商网络时接受检查,目的是阻止伪造流量进一步进入互联网。它不是在受害者边缘才开始的通用攻击过滤,也不是只靠检查目的地址就能完成的规则。

多宿主网络使问题更复杂。一个客户可能同时连接多个运营商,合法流量的进入路径和离开路径也可能不同。若机械套用最严格的反向路径假设,运营商可能误丢正常的非对称流量。RFC 3704,也就是 BCP 84,讨论了这些场景下更适合的过滤方法及权衡。[10]

因此,“打开 BCP 38”不是按一下开关那么简单。运营者需要维护准确的客户前缀记录,在地址分配或路由关系变化时同步更新过滤策略,处理合理例外,监测被丢弃的数据,并确保多宿主和非对称设计不被误伤。规则过严且维护不善,会破坏合法通信;完全不做验证,则可能让本网络成为伪造请求进入更广泛互联网的出口。

BCP 38 与 BCP 84 也有清晰边界。它们能约束依赖伪造源地址的攻击,却不能关闭公开 Memcached 服务,不能替 GitHub 检测异常,不能为 Akamai 增加过滤容量,也不能保证路由交接成功。即使全球所有网络都正确验证源地址,使用真实地址的直接 DDoS、应用层耗尽和其他网络故障仍然存在。

反欺骗为何长期面临激励错位

源地址验证带来的直接安全收益,往往发生在部署者网络之外。运营商承担设备配置、客户支持、例外处理、记录维护和误丢包调查的本地成本;受到保护的却可能是另一国家、另一运营商中的陌生受害者。部署者的客户未必会因为“不能伪造地址”而愿意支付更多费用,受害者也很难逐一奖励那些挡住了攻击请求的边缘网络。

这正是典型的分散成本与公共收益错位。对单个运营者而言,不部署的短期损失可能并不明显;对整个互联网而言,大量类似决定叠加后,却会留下足以支撑反射攻击的伪造能力。防止滥用因此不能只依赖道德号召,还需要可检验的网络记录、行业规范、客户前缀数据、部署测试和有效的运营反馈。

CAIDA Spoofer 项目通过测量网络是否允许客户端发送伪造源地址的数据包,为部署情况提供可重复观察的途径。[14] MANRS 也把反欺骗列为网络运营者可执行的具体行动,并提供相应实施指引。[15] 这些材料能说明控制为何必要、如何测试,却不能反向证明某个具体自治系统在 2018 年 2 月 28 日有意放行了 GitHub 攻击请求。

GitHub 的报告提到,观测到的攻击流量涉及一千多个自治系统和数万个不同端点。[1] 这一描述不能自动转换成一千多家网络的过失清单。端点可能是反射服务器,地址可能代表托管环境或转接路径,公开报告也没有给出逐项身份与角色判定。自治系统出现在流量观测中,并不等于其运营者就是攻击者或明知故犯。

真正可问责的做法,是要求网络在与自身控制相匹配的粒度上保留证据:某个客户端口当时被允许使用哪些源前缀;过滤策略何时生效;例外由谁批准;测试是否发现伪造能力;异常丢包如何处置;前缀或客户关系变更后,规则是否同步。生态级测量可以说明总体趋势,事件级归因仍需事件级证据。

检测必须先于路由交接

GitHub 报告称,监控系统在 17:21 发现入站与出站流量比例异常。[1] 这个公开细节很重要,因为它把缓解决策连接到一个可观测条件,而不是把路由变更描述成无法解释的黑箱动作。

异常比例只是线索,不是最终分类。入站流量突然远高于出站流量,可能来自反射攻击,也可能来自热门事件带来的访问激增、测量错误、上游路径变化或其他网络异常。监控系统需要把“需要调查”与“已确认某种攻击”区分开来。

一套负责任的检测体系应同时观察多个层面。边缘接口提供带宽与包速率;流量记录展示协议、端口、来源分布和目标集中度;路由数据展示哪些路径正在承载流量;路由器、防火墙和负载均衡器计数器反映设备压力;应用探针和响应码则说明合法用户是否真的能够完成操作。

这些信号各有盲点。带宽告警能够发现拥塞,却不能单独判断恶意性;UDP 11211 响应特征能够指向 Memcached 反射,却不能证明每个匹配数据包都应被丢弃;应用错误能够说明用户受影响,但往往晚于网络容量告警;本地路由器显示命令成功,也不能证明全网已经重新收敛。

缓解阈值本身就是运营责任的一部分。启动过晚,服务可能在路由收敛之前已完全不可用;启动过于敏感,则可能因短暂尖峰产生不必要的改道、成本、时延和路由波动。合理阈值应有明确依据、多信号支持、人工覆盖能力和事后复核记录。

GitHub 报告显示,一处设施的入站转接流量上升到 100 Gbps 以上后,团队决定把流量转交 Akamai。[1] 这说明决策不仅看到了攻击总峰值,也考虑了具体边缘设施的承载状态。公开材料没有披露完整阈值、决策规则或所有设施数据,因此外界只能评价已公布的触发与响应时间,不能虚构其内部策略。

BGP 交接转移的是可达性,不是过滤能力

AS36459 是 GitHub 在公开报告中点名的自治系统。[1] 自治系统可以向相邻网络发布其地址前缀的可达路径。当 GitHub 撤回经常规转接供应商的路由,并改为只经 Akamai 链路发布时,它改变了外部网络把目的地为 GitHub 的流量送到哪里。

BGP 是分布式系统。GitHub 可以向直接邻居撤回或发布路由,却不能命令互联网上所有路由器在同一毫秒完成更新。邻居会应用自身策略,选择路径,再把选中的路由传播给其他网络。收敛期间,一部分用户可能已经经 Akamai 抵达 GitHub,另一部分用户仍沿旧路径前进,这与 17:26 至 17:30 的间歇性不可用阶段相吻合,但公开证据并不足以逐地区还原每一条路径。

最关键的技术边界是:BGP 路由变更不会检查一个数据包是不是 Memcached 反射流量。它只改变流量的下一段旅程。真正识别或拒绝攻击数据包的是缓解网络上的过滤控制。GitHub 报告把“路由重新收敛”和“Akamai 边界访问控制列表缓解攻击”并列,正说明两者是相互配合但性质不同的操作。[1]

这次交接至少要求三个环节连续成功。第一,GitHub 必须及时检测并授权改道;第二,互联网路由系统必须把新的可达信息传播出去;第三,Akamai 必须有能力接收这些路由和流量,在边界过滤攻击,再把可用流量交付给 GitHub。任何一环失效,都可能让“已经发出缓解命令”与“用户实际恢复访问”之间出现落差。

路由交接本身也有风险。遗漏前缀可能造成局部不可达;不正确的前缀长度或路由策略可能与既有路径发生意外互动;供应商侧授权不一致可能导致路由被拒;净化回传链路容量不足可能形成新瓶颈;返回路径不对称可能影响有状态设备;与主服务有关的 DNS 或其他依赖也可能在主地址已经可达后继续故障。

因此,可靠交接应在攻击之前排练。运营者需要知道哪些前缀会移动、哪些会话负责发布、供应商如何确认授权、净化流量如何返回、外部观察点如何确认路径变化,以及攻击结束后如何安全撤回缓解路由。演练不应只验证理想的全量切换,还应覆盖缺失前缀、供应商部分失效、回传拥塞和恢复阶段再次受攻击等情形。

容量并不等同于韧性

GitHub 表示,在此前一年已把设施的转接容量提高到原来的两倍以上,并持续在多个互联网交换中心建立多样化对等关系。[1] 这些投入并非无效。额外容量能够吸收正常增长、较小规模攻击和启动缓解所需的时间,也能降低单一连接故障对整体服务的影响。

但容量只有在正确位置、正确路径上可用,才会形成韧性。骨干网络拥有很高的总容量,不代表某个客户边缘或单一设施不会先饱和;缓解供应商拥有庞大网络,不代表客户路由一定能够及时切过去;对等连接很多,也不代表所有路径没有共享同一设施、回传链路或过滤瓶颈。

攻击规模还会改变最合理的承载位置。GitHub 公开说明,某些流量洪峰可以靠自身新增转接容量承受,但像这次攻击一样的事件仍可能需要更大网络的阻断与过滤支持。[1] 这不是“自建容量”和“外部缓解”二选一,而是直连余量、启动时间、缓解能力和回传路径之间的组合设计。

容量声明也必须说明测量边界。一个“1.35 Tbps”峰值究竟来自供应商边缘、多个站点合计、过滤前流量还是目标设施入口,会影响它能回答的问题。GitHub 的数字足以说明事件规模,却不足以证明每一组件承受相同负载。问责应要求指标与测量位置配对,而不是用最大数字代表全部系统状态。

运营目标不应是宣称拥有无限容量。任何有限系统都可能遇到超出设计范围的洪流。更现实的标准是:知道直接路径的承载边界,能够在硬性故障前识别接近上限,按授权切换到更大的缓解网络,并在外部依赖失效时保留可解释的降级和恢复方案。

缓解必须证明合法流量重新到达

丢弃大量攻击数据包并不等于恢复服务。DDoS 缓解有两个同时成立的结果:不需要的流量被限制,需要的流量继续抵达。前者容易用“过滤了多少 Gbps”进行宣传,后者才是用户真正感受到的可用性。

缓解网络可能依据协议特征、数据包有效性、速率、来源信誉或应用行为实施过滤。任何方法都有误判风险。针对 Memcached 响应特征的窄规则可能比较精确,而粗略封锁全部 UDP 则可能破坏合法服务;总量限速可以保护后端,也可能让处于大型共享网络后的真实用户被一起拒绝。

GitHub 表示,Akamai 边界过滤后服务恢复。[1] 这支持“缓解路径整体有效”的结论,却没有公开具体规则、地区差异或误判率。文章不能因此声称每一个合法请求都在 17:30 瞬间成功。更严谨的恢复证据应包括多地区应用探针、成功事务比例、响应延迟、错误率、边缘链路负载和用户可见故障是否回到基线。

净化后的回传路径同样可能成为瓶颈。如果过滤流量经容量较小的专线、隧道或私有连接返回,攻击入口得到控制后,合法流量仍可能堵在回程。如果源站还存在绕过缓解网络的未过滤路径,攻击者可能直接冲击该入口。若来回路径不对称,有状态防火墙或负载均衡设备也可能误丢合法会话。

GitHub 在 17:30 使用转接带宽和负载均衡器响应码确认全面恢复,这是比“过滤设备正在丢包”更接近用户结果的证据。[1] 17:34 的后续交换中心路由撤回则显示,运营者在初步恢复后仍继续收束流量路径。恢复不是一个瞬间亮起的绿灯,而是持续观察、逐步稳定并准备应对下一波攻击的过程。

随后约 400 Gbps 的峰值没有重现最初影响,也为缓解持续性提供了一项观察。[1] 不过,它只证明较晚时段、该攻击条件下的表现。不同协议、包大小、目标服务或绕过路径仍可能产生完全不同的结果。

控制分散,问责也必须分层

Memcached 反射攻击之所以难以用单一主体解释,是因为攻击条件和缓解能力分布在不同组织手中。每个参与方只能控制链条的一部分,也只能对其实际掌握的操作与记录负责。

参与方 实际可控制事项 不能据此推定的事项 应保留的关键证据
GitHub 边缘监控、直连容量、对等互联、AS36459 路由发布、缓解启动授权、应用恢复判断 外部 Memcached 服务器配置、每个源网络策略、Akamai 私有过滤细节 告警时间、决策记录、路由命令、外部可达性、带宽与包速率、负载均衡器响应码
Akamai 接收路由、吸收攻击、边界过滤、净化流量交付 GitHub 内部阈值、反射器暴露成因、攻击者身份 路由接收时间、过滤指标、容量状态、净化回传质量、地区可达性
Memcached 维护者 软件默认值、版本发布、安全说明、推荐配置 每个既有部署的绑定、防火墙与升级状态 默认值变更、版本说明、配置文档、兼容性与风险说明
服务器运营者 服务绑定、UDP 开关、端口过滤、补丁与升级 攻击请求的真实发起者、其他网络的源地址控制 监听状态、防火墙规则、版本记录、暴露扫描、整改时间
托管服务商 客户通知、暴露发现、滥用联系人、合同允许范围内的应急控制 客户恶意、所有 UDP 服务都应封锁 通知记录、联系渠道、暴露清单、应急措施及解除依据
接入与客户边缘网络 客户前缀记录、源地址验证、例外处理、伪造能力测试 仅凭地址或 ASN 就认定参与攻击 前缀授权、过滤配置、测试结果、丢包监控、变更与例外审批
转接与交换网络 按路由和互联策略承载可达信息与流量 默认承担端点配置或攻击意图责任 路由传播、接口负载、策略变更、故障与恢复时间

这张表的价值在于避免两种极端。第一种是把所有责任推给攻击者,从而忽略可由运营者提前削弱的反射、欺骗、交接和恢复风险;第二种是把“互联网失灵”当作笼统结论,从而无法指出任何主体实际能做什么。

GitHub 可以为路由交接准备充分,同时整个生态仍然在反欺骗方面存在缺口;Memcached 可以采用更安全的默认值,同时旧服务器仍然暴露;Akamai 可以成功过滤,同时净化回传或地区性误判仍值得检查。一个环节取得进展,不等于全链条问题已经解决。

自动化应缩短交接,而不是隐藏授权

GitHub 在事后表示,希望利用监控基础设施自动启用 DDoS 缓解供应商,减少对人工介入的依赖,并缩短平均恢复时间。[1] 这一方向回应了真实问题:在大规模流量快速上升时,四五分钟可能意味着大量失败请求和显著运营压力。

但自动化不会因为速度快就天然可靠。系统必须知道什么信号足以触发行动、允许改变哪些前缀、目标供应商路径是否健康、路由变化是否真的对外可见,以及净化后的合法流量是否恢复。若这些边界不清楚,错误监控信号可能被放大成全球可达性故障。

较稳妥的设计会把检测、建议和执行分开。检测层收集多种证据;策略层在多个条件相互印证时建议改道;执行层只对预先批准的前缀、已验证的供应商会话和有限范围采取动作。常见且已演练的攻击向量可以拥有较高自动化程度,陌生或矛盾情形则保留人工确认。

自动化路由控制必须受明确约束。前缀清单要保持最新,供应商侧授权要定期验证,路由过滤和最大前缀限制要防止错误扩散,外部观察点要确认互联网实际看见了预期路径。只看到本地路由器接受配置,并不足以证明远端网络已经收敛。

系统还需要可执行的回退。攻击量下降后过早撤回缓解路由,可能让服务暴露在第二波攻击下;长期不撤回则可能增加成本、时延与单一供应商依赖。合理策略应规定稳定观察期、分阶段回切、直接路径健康验证,以及回切失败时重新进入缓解路径的条件。

每次自动动作都应留下可复核记录:何种信号触发、哪条规则作出决定、哪些路由发生变化、外部观察点看到什么、净化流量表现如何、何时以及为何恢复正常路径。否则,自动化或许减少了停机时间,却会让事后责任更难还原。

人工监督仍不可或缺,因为 DDoS 是对抗性事件。攻击者可以更换协议、包大小、目标和时间,绕过为上一种模式设计的规则。人在紧急情况下需要改变策略,但这种权力也应通过经过演练、有日志、有边界的操作机制行使,而不是临场对生产路由进行不可追踪的修改。

事件披露本身也是基础设施问责

GitHub 的报告之所以具有分析价值,不是因为它宣布“攻击已被缓解”,而是因为它公开了协调世界时时间戳、比特率、包速率、自治系统编号、路由操作、缓解伙伴和恢复信号。[1] 这些信息使其他运营者能够把自身准备情况与一个真实事件对照。

披露当然需要边界。攻击进行时公开精确过滤规则,可能帮助对手调整流量;公开私有拓扑、合同条款或敏感内部通信,也可能带来安全与商业风险。问责并不要求机构实时公开全部技术细节。

但最低限度的公开记录必须能把原因、控制和结果区分开来。“我们抵御了一次复杂攻击”无法说明何时发现异常、哪个网络控制发生变化、用户何时恢复。较为稳妥的公开说明可以列出攻击向量、测量规模、影响区间、主要控制动作、恢复信号和后续改进,同时保留会直接增加攻击风险的实现细节。

不同来源也必须保持各自的证据角色。GitHub 记录的是自身看到的流量与操作;Cloudflare 分析的是 Memcached 协议放大机制;CISA 列举的是可被反射滥用的 UDP 服务;CAIDA 测量的是网络发送伪造源地址流量的能力。把这些来源结合起来可以解释机制,却不能凭空生成 GitHub 事件的完整反射器清单或源网络归因。

这种边界既是事实要求,也是法律审慎。某台服务器响应了伪造请求,可能说明配置暴露,却不能单独证明所有者的主观意图;某个网络出现在地址记录中,也可能只反映托管或转接角色。公共问责应要求相关主体拿出整改证据,而不是把不完整遥测转换成失实指控。

公开证据不能证明什么

首先,公开资料没有确认攻击者身份或动机。GitHub 的事件报告没有给出确定归因,因此不能把其他时间、其他僵尸网络或其他司法案件中的主体嫁接到本案,也不能将本案称为 Mirai 攻击。

其次,公开资料没有提供完整的反射器所有者清单。GitHub 报告的自治系统与端点数量描述了观测规模,不等于逐项确认谁运行服务器、谁发送伪造请求、哪家网络在何时使用何种源地址验证策略。一般性测量也不能在缺乏匹配证据时倒推到具体事件。

第三,公开资料没有披露 GitHub 的完整路由策略、自动化保护措施或 Akamai 合同。外界不知道商业触发条件、容量保证、所有路由属性、过滤规则和净化回传架构。已知的是操作顺序及结果,不是私有实现图。

第四,1.35 Tbps 峰值不能证明所有链路与设备都处理了相同流量,126.9 Mpps 也不能单独指出哪个组件先达到极限。测量点、聚合范围、过滤前后状态和峰值持续时间都会改变解释。

第五,公开资料没有量化客户损失,也没有作出疏忽或法律责任认定。GitHub 的不可用显然会影响依赖它的用户,但在没有证据时,文章不能虚构损失数字、合同后果或法律结论。

明确这些未知项并不会削弱文章。相反,它把讨论限定在能够验证的控制上:检测时间、路由权限、缓解交接、协议暴露、安全默认值、源地址验证、净化流量交付与恢复记录。

未来大型流量事件需要怎样的最低证据

面向未来,运营者不必公开全部敏感配置,但应为内部复核和适度公共披露保留一份可验证的最低证据记录。

第一,记录影响边界。必须区分完全不可用、间歇性不可用、性能下降以及仅内部容量告警,并分别标明开始、缓解和恢复时间。数据机密性、完整性与可用性也应分开说明,避免把可用性事件含混描述成全面安全失陷。

第二,记录流量测量。比特率、包速率、协议、端口和目标分布应与测量位置、聚合范围及过滤前后状态配对。若公布峰值,还应说明其是瞬时还是持续值,以及来自目标网络还是缓解供应商边缘。

第三,记录检测依据。需要保存哪些信号最先异常、哪些信号用于确认影响、告警发给谁,以及从告警到行动经过多久。对外未必需要披露精确阈值,但内部必须能证明阈值并非事后杜撰。

第四,记录控制授权。路由变更涉及哪些前缀与自治系统、谁有权启动、操作如何审批、供应商侧如何验证、哪些安全限制防止误发布,都应留下时间化记录。

第五,记录外部可达性。仅有本地配置不足以证明交接成功,应从多个独立网络或地区观察路由传播、路径变化和服务可达性。若收敛存在地区差异,也应在恢复判断中体现。

第六,记录过滤与净化交付。缓解供应商应能够说明接收了多少流量、哪些规则类别生效、合法流量怎样返回、是否观察到误判以及回传链路是否成为瓶颈。敏感规则细节可以保留,但结果指标不能缺席。

第七,记录应用恢复。网络接口恢复正常不代表用户服务已经恢复。应用探针、关键事务、负载均衡器响应码、错误率、时延和用户报告应共同构成恢复证据。

第八,记录反射条件的整改。软件默认值是否改变、暴露实例是否减少、托管客户是否收到通知、源地址验证是否重新测试,都应有明确完成状态。否则,事件关闭只代表当前洪流停止,而非使复发条件得到削弱。

第九,记录未知项。攻击者身份不明、反射器清单不完整、某些地区遥测缺失,都应明确写出。把未知内容隐藏在笼统措辞中,会让后续人员误以为证据已经闭合。

第十,记录回切与复发观察。缓解路由何时撤回、直接路径如何验证、第二波攻击是否出现、回切失败如何回滚,都是连续性证明的一部分。GitHub 报告中的 17:34 后续路由动作和随后 400 Gbps 峰值,正说明恢复之后仍有需要记录的运营阶段。[1]

问责不是寻找一个替所有人负责的对象

在复杂网络事件中,“谁应该负责”往往被误解成必须选出唯一主体。更准确的问题是:谁控制了哪项决定,掌握什么证据,能改变什么条件,又有哪些事项超出其权限。

GitHub 应对检测、缓解启动、路由变更和恢复判断负责说明;Akamai 应对其接收、过滤和净化交付能力负责说明;Memcached 维护者应对默认值和运行指导负责说明;服务器及托管运营者应对暴露状态与整改负责说明;接入网络应对客户边缘的源地址验证负责说明。

这些主体的问责程度并不相同,也不能自动转换成法律过错。一个机构可能对某项运营控制负有解释义务,却并非攻击发起者;某台服务器可能成为反射器,却没有证据证明其所有者主动作恶。技术问责的价值,在于把能够改进的控制与无法支持的指控分开。

GitHub 是受害者,但受害者仍控制着自身边缘韧性和缓解交接;Memcached 服务器运营者没有控制攻击目标,却控制自身服务是否公网暴露;接入网络没有配置反射器,却控制伪造源地址的数据包能否离开客户边缘。正因为控制分散,整改也必须分散。

这种方法比笼统归咎“互联网”更严格。它要求每个主体拿出与实际权限相匹配的记录,又拒绝用网络地址、流量规模或事后猜测填补缺失证据。

可验证的连续性比“绝对安全”更现实

没有任何网络能够保证每一次攻击都毫无影响。攻击者可以聚合更多资源,寻找新的反射协议,转向应用层耗尽,攻击 DNS 或其他依赖,也可以在运营者回切时发动第二波流量。把“完美防御”设为标准,既无法执行,也容易催生空泛承诺。

更可行的标准是,在明确条件下证明服务连续性。目标网络应知道直连路径的容量边界、缓解启动时间、路由收敛假设、净化回传容量和关键应用探针;应在紧急情况之前测试交接,并记录哪些服务能够降级、哪些功能必须维持。

源网络也需要可验证标准。接入运营者应能测试客户是否可发送伪造源地址数据包;托管商应能识别高风险公网服务并联系责任人;软件项目应采用更安全的默认值并把网络暴露风险写清楚;测量结果则应注明时间和范围。

这些控制都伴随权衡。源地址过滤部署不当可能误伤非对称路径;激进缓解规则可能阻断合法用户;路由改道可能增加时延和供应商依赖;关闭 UDP 可能影响少数既有应用。负责任的运营不是否认代价,而是记录代价、限制权限、持续观察并保留回退。

GitHub 事件的价值,在于它让这一整条链条变得可见:公开暴露的 Memcached 服务产生放大响应,伪造源地址把响应引向 GitHub,GitHub 监控发现异常,AS36459 的路由控制把流量转交 Akamai,Akamai 实施过滤,应用信号证明恢复,公开报告则保存了关键时间线。[1]

没有任何单项控制能够独自解释结果。增加转接容量不能关闭反射器;BGP 撤回不能识别恶意包;源地址验证不能提供净化容量;安全默认值不能修复所有旧部署;缓解供应商也无法在目标网络没有可用交接机制时凭空接管流量。

把缓解交接变成可复核的运行证据

缓解交接的第一项准备,不是临时寻找能够下命令的人,而是事先约定路由权限:谁可以启动改道,授权覆盖哪些前缀和邻接关系,哪些观测条件足以触发操作,缓解供应商由谁确认已经具备接收条件,紧急覆盖又怎样留下记录。权限若直到洪流到来才讨论,操作速度就会受制于身份确认与跨方协调;权限若没有范围约束,一个正确方向的决定也可能扩大成新的可达性故障。

路由撤回因此应当是有边界的动作。执行前需要核对受影响前缀、预期撤回的常规路径、仍应保留的缓解路径以及可立即使用的回退状态;执行后则要比较本地路由器记录与外部观察结果。设备接受命令,只能证明配置进入本地控制面,不能证明远端网络已经看到预期路径,更不能证明所有前缀都没有遗漏。范围、时间和观察点共同确定了这次撤回究竟改变了什么。

交接记录还必须把可达性与过滤分开。BGP 负责把目的流量引向缓解网络,缓解供应商的边界控制才负责识别和限制攻击流量。[1] 因而,一次有效交接至少要能对应四类证据:目标前缀已被缓解网络接收,常规路径按批准范围撤回,过滤控制已经生效,合法流量仍有可用的交付路径。只有路由变化而没有过滤状态,不能写成攻击已被清除;只有过滤计数而没有路径证据,也不能证明洪流实际进入了相应设施。

净化后流量返回目标网络,是交接中最容易被一句“已缓解”掩盖的部分。回传链路、隧道或私有连接必须有足够余量,源站不应保留可被绕过净化路径直接冲击的入口,非对称路径也不能让有状态设备误丢合法会话。供应商看到大量数据包被丢弃,并不等于用户请求已经成功;目标网络还要观察返回带宽、关键事务、错误率、时延和负载均衡器响应,确认清洁流量确实抵达应用。

这些条件不能只在攻击期间首次验证。容量演练应分别检验控制面和数据面:路由发布与撤回能否按预期传播,供应商会话和授权是否有效,过滤后的返回路径是否承受预期负载,转接链路、边缘设备与应用入口之间是否存在更窄的瓶颈。演练不必模拟无限洪流,但应覆盖不同的比特压力与包处理压力,因为总带宽有余量并不表示设备仍有足够的每包处理能力。

预先定义停止条件同样重要。外部路由与预期不符、关键前缀失去可达性、合法探针显著恶化、回传路径接近瓶颈、供应商尚未就绪或监测信号彼此冲突时,自动或人工操作都应停止扩大变更,并回到最近一个已验证状态。停止条件不是对速度的否定,而是防止一次局部缓解因连续撤路由、反复回切或错误过滤演变成第二个故障。

恢复也需要预先约定的指标,而不能凭攻击流量下降作判断。多地可达性、成功事务比例、错误率、响应时延、转接带宽、负载均衡器响应码、外部路由可见性和净化回传负载应共同进入恢复判断。[1] 指标还应经过一段稳定观察,并注明测量位置与过滤前后状态。否则,供应商边缘恢复、目标网络恢复和用户实际恢复可能被误写成同一个时刻。

源地址验证属于另一层控制,不能被塞进交接结果中充当万能解释。BCP 38 要求在适当边缘限制不符合授权前缀的数据包,BCP 84 则提醒多宿主和非对称路径需要更审慎的设计。[9][10] 相关规则应随客户前缀和路由关系更新,并通过可重复测试与丢包观察校验;CAIDA Spoofer 和 MANRS 提供了测量及部署参考。[14][15] 这些措施能够减少伪造请求离开源网络的机会,却不能关闭暴露服务、替代缓解容量或保证净化流量返回。

事后证据应能按时间重建每一次控制权转移:最初异常信号是什么,谁依据既定权限批准操作,实际涉及哪些前缀,外部何时观察到新路径,供应商何时开始过滤,清洁流量从何时起稳定交付,哪些停止条件被检查,何时开始回切以及依据哪些恢复指标。各方无需公开会帮助对手规避防御的规则细节,但应保存足以验证动作范围、先后关系和结果的数据。

证据质量还取决于记录能否相互校对。路由日志、供应商接收时间、接口与过滤计数、应用探针及用户可见错误应使用可对齐的时间基准;流量数字应标明测量位置、聚合范围以及过滤前后;缺失的地区观察或不完整的遥测应明确列为未知,而不是用单一成功信号填补。复盘时据此检查授权是否含糊、撤回是否越界、容量演练遗漏了哪条路径、停止条件是否及时,以及恢复指标是否真正代表合法用户。

结论

GitHub 2018 年 Memcached 攻击不仅是一项当时引人注目的 DDoS 流量纪录,更是一场网络权限在压力下如何移动的现场测试。GitHub 在 17:21 发现异常,17:26 启动路由转移,外部网络随后重新收敛,Akamai 在边界实施过滤,GitHub 于 17:30 根据网络和应用信号确认恢复,并在 17:34 继续收束互联网交换中心路径。[1]

攻击机制揭示的是另一条分散控制链:公网 Memcached 服务生成放大响应,伪造源地址让响应转向受害者,源网络把请求送出,目标和缓解供应商则必须在洪流中维持可达性。软件默认值、服务器暴露、源地址验证、路由政策、过滤容量与应用恢复缺一不可。

因此,可靠的问责标准应是一条证据链。目标网络要说明何时发现损害、谁有权移动路由、缓解路径如何得到验证、什么应用信号证明恢复;缓解供应商要证明过滤和净化交付结果;服务器与托管运营者要证明暴露控制;接入网络要证明源地址验证;软件项目要证明安全默认值和清晰指导。

GitHub 的公开时间线没有假装所有未知项都已解决,却让关键运营动作具备了可检验性。网络韧性真正可信的时刻,不是机构声称自己拥有足够带宽,而是掌握实际控制权的各方能够证明流量如何被测量、路由权限如何转移、合法用户如何恢复,以及促成攻击的条件此后如何被削弱。

来源

  1. https://github.blog/news-insights/company-news/ddos-incident-report/
  2. https://github.blog/news-insights/the-library/denial-of-service-attacks/
  3. https://blog.cloudflare.com/memcrashed-major-amplification-attacks-from-port-11211/
  4. https://blog.cloudflare.com/the-root-cause-of-large-ddos-ip-spoofing/
  5. https://blog.cloudflare.com/the-rise-of-multivector-amplifications/
  6. https://www.cisa.gov/ncas/alerts/ta14-017a
  7. https://docs.memcached.org/advisories/ddos/
  8. https://github.com/memcached/memcached/wiki/ConfiguringServer
  9. https://datatracker.ietf.org/doc/rfc2827/
  10. https://datatracker.ietf.org/doc/rfc3704/
  11. https://datatracker.ietf.org/doc/rfc4948/
  12. https://www.akamai.com/site/en/documents/brochure/memcached-reflection-attacks-launch-a-new-era-for-ddos-brochure.pdf
  13. https://www.akamai.com/site/en/documents/state-of-the-internet/soti-summer-2018-attack-spotlight.pdf
  14. https://www.caida.org/projects/spoofer/
  15. https://docs.manrs.org/docs/network-guide/anti-spoofing/
  16. https://www.cloudflare.com/learning/ddos/memcached-ddos-attack/
  17. https://www.cloudflare.com/learning/ddos/famous-ddos-attacks/
  18. https://www.ietf.org/archive/id/draft-qin-savnet-incentive-00.html