这就是 SSRF,Server-Side Request Forgery。攻击者精心构造一个 URL,让服务器去访问它本来不该访问的内网资源——云环境的元数据接口、内部服务的 API、数据库的管理端口。服务器有权限访问这些东西,而攻击者没有,但攻击者借服务器的手去碰了它们。2019 年 Capital One 数据泄露,超过一亿条客户记录被盗,入口就是一个 SSRF 漏洞,攻击者通过它拿到了云实例的 IAM 凭证。
Paul McKenney 在九十年代想了一个看似疯狂的方案:读的时候完全不加锁,连 barrier 都不打。写者修改数据时不是原地覆盖,而是先拷贝一份,改拷贝,再把指针原子地切过去。旧的读者还在看老数据,没关系,让它看完。等所有可能的旧读者都离开了(内核已经有办法检测这一点),再回收老副本。这就是 RCU——Read-Copy-Update。
它的核心想法其实特别朴素:。这个窗口叫做 grace period,在非抢占内核里就是一个完整的调度周期——只要每个 CPU 都经历过一次上下文切换,就说明没有旧读者还卡在临界区里了。synchronize_rcu() 就是等这个周期,call_rcu() 是异步版本,注册一个回调在 grace period 结束后自动释放旧数据。
代码写起来非常简单。读者侧就是 rcu_read_lock() / rcu_read_unlock(),在非抢占配置下编译成空操作——零指令。写者侧用 rcu_assign_pointer() 发布新指针,用 kfree_rcu() 延迟释放旧结构。整个 API 面极窄,心智负担几乎没有。