首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >032_重入攻击防御全解:从ReentrancyGuard到2025年高级防护模式,构建智能合约的安全边界

032_重入攻击防御全解:从ReentrancyGuard到2025年高级防护模式,构建智能合约的安全边界

作者头像
安全风信子
发布2025-11-16 17:00:56
发布2025-11-16 17:00:56
2480
举报
文章被收录于专栏:AI SPPECHAI SPPECH

一、重入攻击原理与威胁概述

1.1 重入攻击的基本原理

重入攻击(Reentrancy Attack)是智能合约中最危险的漏洞之一,其核心原理是利用合约在完成状态更新前进行外部调用的时间窗口发起攻击。当攻击者能够在合约执行完成前重复调用同一函数时,就可能绕过状态检查和余额更新,导致资金被无限提取。

重入攻击的基本流程如下:

  1. 攻击者部署恶意合约,其中包含攻击函数
  2. 恶意合约调用目标合约的提款/转账函数
  3. 目标合约在更新攻击者余额前向恶意合约发送资金
  4. 资金发送触发恶意合约的receive/fallback函数
  5. 恶意合约再次调用目标合约的提款/转账函数
  6. 由于目标合约尚未更新攻击者余额,攻击者仍被视为具有原始余额
  7. 循环重复,直到耗尽gas或达到其他限制

这种攻击之所以有效,是因为以太坊的执行模型允许在一个交易中嵌套多次合约调用,而合约状态只有在整个执行完成后才会被最终确定。

1.2 重入攻击的历史危害

重入攻击已经造成了区块链历史上多起严重的资金损失事件:

  1. The DAO事件(2016)
    • 损失金额:约6000万美元的ETH
    • 影响:导致以太坊硬分叉,分裂出ETH和ETC
    • 攻击方式:利用DAO合约的withdrawDAO函数中的重入漏洞
  2. Lendf.Me事件(2020)
    • 损失金额:约2500万美元的加密资产
    • 影响:导致多个DeFi协议流动性下降
    • 攻击方式:利用闪电贷放大攻击效果,通过重入漏洞提取超额资金
  3. Harvest Finance事件(2020)
    • 损失金额:约3400万美元
    • 影响:多个策略池受到影响
    • 攻击方式:结合价格操纵和重入攻击
  4. Compound早期漏洞(2018)
    • 影响:差点导致协议资金损失,后及时修复
    • 漏洞:cToken合约中的重入风险

据统计,2024年智能合约攻击中,约18%的攻击与重入漏洞相关,造成的总损失超过5亿美元。这凸显了重入攻击防御在智能合约开发中的重要性。

1.3 重入攻击的类型与变种

随着合约开发技术的进步,重入攻击也演变出多种类型和变种:

  1. 单函数重入(Single-function Reentrancy)
    • 最简单的形式,攻击者重复调用同一个函数
    • 通常发生在提款和转账函数中
  2. 跨函数重入(Cross-function Reentrancy)
    • 攻击者利用一个函数的外部调用去重入另一个函数
    • 更难检测,因为漏洞涉及多个函数间的交互
  3. 跨合约重入(Cross-contract Reentrancy)
    • 攻击者利用多个相互调用的合约链进行攻击
    • 常见于复杂的DeFi协议组合使用场景
  4. 闪电贷重入(Flash Loan Reentrancy)
    • 结合闪电贷放大攻击效果
    • 可以在单个交易中提取大量资金
  5. 预言机重入(Oracle Reentrancy)
    • 针对依赖预言机的合约,通过操纵预言机更新过程进行攻击
    • 影响价格相关的金融合约

二、重入攻击防御基础机制

2.1 Checks-Effects-Interactions模式

Checks-Effects-Interactions模式是防御重入攻击的最基本也是最有效的编程范式:

  1. Checks(检查):首先执行所有状态检查和条件验证
  2. Effects(效果):然后更新合约状态变量
  3. Interactions(交互):最后进行外部合约调用或ETH转账

通过遵循这个模式,可以确保在进行任何外部调用前,合约的状态已经被正确更新,从而防止重入攻击。

不安全的实现:

代码语言:javascript
复制
// 不安全:先进行外部调用,后更新状态
function withdraw(uint amount) public {
    require(balances[msg.sender] >= amount, "Insufficient balance");
    // 危险:在更新状态前进行外部调用
    (bool success, ) = msg.sender.call{value: amount}("");
    require(success, "Transfer failed");
    // 状态更新太晚,可能被重入
    balances[msg.sender] -= amount;
}

安全的实现:

代码语言:javascript
复制
// 安全:遵循Checks-Effects-Interactions模式
function withdraw(uint amount) public {
    // 1. Checks
    require(balances[msg.sender] >= amount, "Insufficient balance");
    
    // 2. Effects
    balances[msg.sender] -= amount;
    
    // 3. Interactions
    (bool success, ) = msg.sender.call{value: amount}("");
    require(success, "Transfer failed");
}

Checks-Effects-Interactions模式不仅防御重入攻击,还能提高合约的可读性和可维护性。2025年,这已经成为智能合约开发的标准实践。

2.2 ReentrancyGuard机制详解

ReentrancyGuard是一种通过互斥锁机制防止重入的防御模式,OpenZeppelin库提供了标准实现:

工作原理

  • 使用一个状态变量跟踪合约是否正在执行敏感函数
  • 在函数开始时获取锁,在函数结束时释放锁
  • 如果攻击者尝试在锁已被获取时再次调用函数,交易将被拒绝

OpenZeppelin实现

代码语言:javascript
复制
// OpenZeppelin的ReentrancyGuard简化版实现
abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    
    uint256 private _status;
    
    constructor() {
        _status = _NOT_ENTERED;
    }
    
    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

使用方法

代码语言:javascript
复制
// 在合约中使用ReentrancyGuard
contract SecureContract is ReentrancyGuard {
    // 在敏感函数上应用nonReentrant修饰符
    function withdraw(uint amount) public nonReentrant {
        // 函数逻辑
    }
}

注意事项

  • 修饰符应该应用在所有处理资金或更新关键状态的函数上
  • 对于继承关系复杂的合约,需要注意修饰符的应用顺序
  • 在多线程或多交易场景下,此机制仍能有效工作
2.3 函数锁定与状态管理

除了ReentrancyGuard,还有其他函数锁定和状态管理技术可以防止重入攻击:

状态变量锁定

  • 使用特定的状态变量标记操作状态
  • 可以针对特定功能或特定用户设置锁定
代码语言:javascript
复制
mapping(address => bool) private _isWithdrawing;

modifier noConcurrentWithdraw() {
    require(!_isWithdrawing[msg.sender], "Concurrent withdrawal not allowed");
    _isWithdrawing[msg.sender] = true;
    _;
    _isWithdrawing[msg.sender] = false;
}

事件驱动状态更新

  • 将状态更新与外部调用解耦
  • 使用两步操作模式
代码语言:javascript
复制
// 两步提款模式
mapping(address => uint) private _pendingWithdrawals;

function requestWithdrawal(uint amount) public {
    require(balances[msg.sender] >= amount, "Insufficient balance");
    balances[msg.sender] -= amount;
    _pendingWithdrawals[msg.sender] += amount;
    emit WithdrawalRequested(msg.sender, amount);
}

function executeWithdrawal() public {
    uint amount = _pendingWithdrawals[msg.sender];
    require(amount > 0, "No pending withdrawal");
    _pendingWithdrawals[msg.sender] = 0;
    (bool success, ) = msg.sender.call{value: amount}("");
    require(success, "Transfer failed");
}

批量处理模式

  • 收集操作请求,批量执行外部调用
  • 减少外部调用的频率,降低攻击面

三、高级重入防御技术

3.1 可重入函数安全设计

某些情况下,合约需要设计成可重入的,但仍然要保证安全性:

受控重入模式

  • 明确允许特定合约的重入调用
  • 使用白名单机制限制可重入的来源
代码语言:javascript
复制
mapping(address => bool) private _trustedContracts;

modifier controlledReentrant() {
    // 非白名单合约禁止重入
    if (!_trustedContracts[msg.sender]) {
        require(_status != _ENTERED, "Not trusted");
        _status = _ENTERED;
    }
    _;
    if (!_trustedContracts[msg.sender]) {
        _status = _NOT_ENTERED;
    }
}

上下文感知重入控制

  • 基于调用上下文决定是否允许重入
  • 使用调用堆栈深度或其他上下文信息
代码语言:javascript
复制
modifier contextAwareReentrant() {
    // 只在特定上下文中允许重入
    require(contextAllowsReentrancy(), "Reentrancy not allowed in this context");
    _;
}

状态一致性检查

  • 在函数执行前后验证状态一致性
  • 即使发生重入,也能检测到不一致并回滚
代码语言:javascript
复制
modifier stateConsistent() {
    uint256 preStateHash = getStateHash();
    _;
    uint256 postStateHash = getStateHash();
    require(postStateHash == preStateHash || stateChangedLegitimately(), 
            "State inconsistency detected");
}
3.2 代理合约与升级合约的重入防护

代理模式合约面临特殊的重入风险,需要额外的防护措施:

代理模式的重入风险

  • 代理合约和实现合约之间的调用可能导致复杂的重入路径
  • 升级过程中的状态转换容易被攻击利用

代理合约重入防护

  • 在代理层实现重入保护
  • 确保升级逻辑安全,防止升级过程中的重入
代码语言:javascript
复制
// 代理合约中的重入保护
function _fallback() internal {
    require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
    _status = _ENTERED;
    
    // 委托调用到实现合约
    (bool success, ) = _implementation.delegatecall(msg.data);
    
    _status = _NOT_ENTERED;
    
    // 处理返回数据
    bytes memory returndata = msg.data;
    assembly {
        switch success
        case 0 { revert(add(returndata, 32), mload(returndata)) }
        default { return(add(returndata, 32), mload(returndata)) }
    }
}

升级安全最佳实践

  • 使用时间锁控制升级权限
  • 实施多签机制管理升级过程
  • 升级前进行全面的安全审计
3.3 跨合约交互的安全模式

在复杂的DeFi生态系统中,跨合约交互的重入防护至关重要:

调用图分析与风险识别

  • 绘制合约调用图,识别潜在的重入路径
  • 特别关注外部依赖和回调函数

安全委托调用模式

  • 限制委托调用的权限和范围
  • 验证委托调用的返回值和状态变化
代码语言:javascript
复制
// 安全的外部调用包装器
function safeExternalCall(address target, bytes memory data) internal returns (bool, bytes memory) {
    require(_isAuthorized(target), "Unauthorized external call");
    
    // 保存状态快照
    uint256 stateSnapshot = _getStateSnapshot();
    
    // 执行外部调用
    (bool success, bytes memory returndata) = target.call{value: 0}(data);
    
    // 验证状态变化
    require(_validateStateChanges(stateSnapshot), "Invalid state changes detected");
    
    return (success, returndata);
}

隔离执行环境

  • 使用沙盒模式执行外部调用
  • 限制每次调用的影响范围和资源使用

四、2025年新型重入防御技术

4.1 形式化验证的重入防护

形式化验证技术正在成为重入防护的重要补充:

合约行为形式化规范

  • 使用数学语言定义合约的安全属性
  • 明确禁止重入行为的形式化描述

自动化重入漏洞证明

  • 使用SMT求解器证明合约的重入安全性
  • 生成反例指导开发者修复漏洞

Certora Prover等工具应用

  • 使用CVL语言编写重入安全规范
  • 自动化验证合约是否满足规范
代码语言:javascript
复制
// Certora验证语言中的重入安全规范
rule noReentrancy() {
    env e;
    address user;
    
    // 执行任何操作序列
    calldataarg args;
    contract.functions{f: *}(e, user, args);
    
    // 验证合约状态一致性
    assert totalAssets == sumOfUserBalances(), "Inconsistent asset balances";
}
4.2 AI驱动的重入检测与防护

人工智能技术正在革新重入漏洞的检测和防护:

  1. 深度学习漏洞检测模型
    • 训练模型识别重入漏洞模式
    • 自动分析代码中的重入风险
  2. 动态执行路径分析
    • 使用AI预测所有可能的执行路径
    • 识别潜在的重入攻击向量
  3. 自动修复建议
    • 基于检测到的漏洞生成修复建议
    • 提供符合最佳实践的代码重构方案
  4. 实时代码审计工具
    • IDE集成的AI审计插件
    • 编写代码时实时检测重入风险
4.3 区块链层重入防护机制

区块链基础设施层也在发展重入防护机制:

  1. EIP-2938和状态访问列表
    • 限制合约对状态的访问,防止意外重入
    • 优化gas使用,提高执行效率
  2. 交易级原子性增强
    • 改进交易执行模型,减少重入可能性
    • 引入更强的原子性保证
  3. 分叉选择规则优化
    • 激励矿工拒绝可能导致重入攻击的交易
    • 增强网络对攻击交易的抵抗力

五、重入攻击防御最佳实践

5.1 开发阶段防御策略

在合约开发阶段采取的防御策略:

  1. 安全编码规范
    • 严格遵循Checks-Effects-Interactions模式
    • 使用成熟的库和组件,避免重复发明
    • 代码审查清单中包含重入检查项
  2. 防御性编程技术
    • 最小权限原则:限制外部调用的权限和影响
    • 深度防御:多层防护机制,不仅依赖单一技术
    • 健壮性设计:处理所有异常情况,包括恶意调用
  3. 开发工具链安全集成
    • 使用静态分析工具进行早期检测
    • CI/CD流程中集成安全扫描
    • 代码提交前的自动化安全检查
5.2 测试与验证策略

针对重入攻击的专门测试和验证策略:

重入攻击模拟测试

  • 编写专门的重入测试用例
  • 使用多种攻击向量测试合约 resilience
代码语言:javascript
复制
// 重入攻击测试示例
describe("Reentrancy Protection", function() {
  it("should prevent reentrancy attacks", async function() {
    // 部署目标合约和攻击合约
    const Target = await ethers.getContractFactory("TargetContract");
    const target = await Target.deploy();
    await target.deployed();
    
    const Attacker = await ethers.getContractFactory("ReentrancyAttacker");
    const attacker = await Attacker.deploy(target.address);
    await attacker.deployed();
    
    // 设置初始状态
    await target.deposit({value: ethers.utils.parseEther("10")});
    await attacker.addFunds({value: ethers.utils.parseEther("1")});
    
    // 尝试攻击并验证防御是否有效
    const targetBalanceBefore = await ethers.provider.getBalance(target.address);
    
    // 应该回滚攻击交易
    await expect(attacker.attack()).to.be.reverted;
    
    // 验证余额没有异常变化
    const targetBalanceAfter = await ethers.provider.getBalance(target.address);
    expect(targetBalanceAfter).to.equal(targetBalanceBefore);
  });
});

模糊测试与符号执行

  • 使用Echidna等工具进行模糊测试
  • 通过符号执行探索所有可能的执行路径

审计与第三方验证

  • 聘请专业安全团队进行审计
  • 参与漏洞赏金计划,获取社区审查
5.3 部署与运行时监控

合约部署后的运行时监控策略:

异常行为监控

  • 部署监控合约跟踪异常调用模式
  • 设置阈值警报,及时发现可疑活动
代码语言:javascript
复制
// 简化的调用模式监控合约
contract CallMonitor {
    mapping(address => uint) public callCounts;
    mapping(address => uint) public lastCallTime;
    uint public threshold = 10;
    uint public timeWindow = 1 seconds;
    
    event SuspiciousActivity(address caller, uint count, uint timeWindow);
    
    modifier monitorCalls() {
        // 检查调用频率
        uint currentTime = block.timestamp;
        if (lastCallTime[msg.sender] > 0 && 
            currentTime - lastCallTime[msg.sender] < timeWindow) {
            callCounts[msg.sender]++;
            if (callCounts[msg.sender] > threshold) {
                emit SuspiciousActivity(msg.sender, callCounts[msg.sender], timeWindow);
                // 可选:执行防御操作,如暂停功能
            }
        } else {
            callCounts[msg.sender] = 1;
        }
        lastCallTime[msg.sender] = currentTime;
        
        _;
    }
}

自动响应机制

  • 配置自动暂停功能,在检测到攻击时触发
  • 设计紧急响应流程,最小化潜在损失

持续安全评估

  • 定期重新评估合约安全性
  • 根据新发现的漏洞模式更新防御措施

六、重入攻击案例分析与修复

6.1 The DAO事件深度分析

The DAO事件是区块链历史上最著名的重入攻击案例:

事件回顾

  • 发生时间:2016年6月
  • 攻击方法:利用splitDAO函数中的重入漏洞
  • 技术细节:withdrawDAO函数在更新余额前进行了外部调用

漏洞代码分析

代码语言:javascript
复制
// 简化的有漏洞代码
function withdrawDAO(uint amount) noEther internal returns (bool) {
    if (balances[msg.sender] >= amount) {
        // 危险:在更新状态前发送以太币
        if (msg.sender.call.value(amount)()) {
            // 太晚更新状态
            balances[msg.sender] -= amount;
            return true;
        }
    }
    return false;
}

修复方案

  • 应用Checks-Effects-Interactions模式
  • 在发送以太币前更新所有状态变量
代码语言:javascript
复制
// 修复后的代码
function withdrawDAO(uint amount) noEther internal returns (bool) {
    // Checks
    if (balances[msg.sender] < amount) {
        return false;
    }
    
    // Effects
    balances[msg.sender] -= amount;
    
    // Interactions
    if (msg.sender.call.value(amount)()) {
        return true;
    } else {
        // 失败情况下恢复状态
        balances[msg.sender] += amount;
        return false;
    }
}
6.2 Lendf.Me事件分析与启示

2020年的Lendf.Me攻击展示了重入攻击与闪电贷结合的威力:

  1. 事件概述
    • 损失金额:约2500万美元
    • 攻击方法:利用闪电贷放大攻击,结合重入漏洞
    • 技术特点:在单个交易中完成攻击
  2. 攻击链分析
    • 攻击者从Aave借出大量ETH
    • 使用这些ETH在Lendf.Me上存款
    • 利用重入漏洞重复提取超额资金
    • 归还闪电贷,保留非法获取的资产
  3. 关键漏洞点
    • 合约未正确处理余额更新
    • 缺少重入防护机制
    • 未验证外部调用的安全性
  4. 启示
    • 即使是成熟的协议也可能存在重入漏洞
    • 需要综合考虑多种攻击向量的组合
    • 闪电贷等DeFi原语增加了攻击的复杂性
6.3 DeFi协议重入防护演进

DeFi协议的重入防护措施随着技术发展不断演进:

  1. 早期协议
    • 缺乏系统性防护
    • 依赖基本的编程实践
    • 容易受到攻击
  2. 中期发展
    • 引入ReentrancyGuard等标准防护
    • 开始重视形式化验证
    • 建立安全最佳实践
  3. 现代协议
    • 多层次防御体系
    • 自动化安全工具集成
    • 社区审查和持续监控
  4. 案例对比
    • Uniswap V1 vs V3的安全演进
    • Compound早期版本与当前版本的防护对比
    • Aave安全架构的改进历程

七、未来重入防御趋势与建议

7.1 技术发展趋势预测

重入防御技术将在以下方向持续发展:

  1. 语言级防护
    • Solidity等智能合约语言内置重入防护
    • 类型系统扩展,在编译时检测重入风险
    • 编译器优化,自动应用安全模式
  2. 工具链成熟
    • 更智能的静态和动态分析工具
    • 开发环境集成的实时安全反馈
    • 自动化修复和重构工具
  3. 标准化与最佳实践
    • 行业统一的安全标准
    • 形式化验证的广泛应用
    • 安全模式库和设计模式的完善
  4. 基础设施改进
    • 区块链底层提供更安全的执行环境
    • 交易模型优化,减少重入可能性
    • 共识机制改进,提高安全性
7.2 开发者安全建议

针对智能合约开发者的具体安全建议:

知识与技能提升

  • 深入理解重入攻击原理和防御机制
  • 持续学习最新的安全研究和漏洞案例
  • 参与安全社区和培训

开发实践建议

  • 始终使用最新版本的开发工具和库
  • 采用防御性编程思维
  • 进行充分的测试和验证
代码语言:javascript
复制
// 推荐的安全开发模式
contract SecureContract {
    // 使用OpenZeppelin的安全组件
    using SafeERC20 for IERC20;
    
    // 应用重入防护
    uint private _status;
    modifier nonReentrant() {
        require(_status == 0, "Reentrant call");
        _status = 1;
        _;
        _status = 0;
    }
    
    // 安全的提款函数
    function withdraw(uint amount) external nonReentrant {
        // Checks
        require(balances[msg.sender] >= amount, "Insufficient balance");
        
        // Effects
        balances[msg.sender] -= amount;
        totalBalance -= amount;
        
        // Interactions
        (bool success, ) = msg.sender.call{value: amount}("");
        require(success, "Transfer failed");
        
        emit Withdrawal(msg.sender, amount);
    }
}

审计与测试策略

  • 代码审查清单中包含重入检查项
  • 使用自动化工具进行早期检测
  • 编写专门的重入攻击测试用例
7.3 项目方安全治理

针对项目方的安全治理建议:

  1. 安全文化建设
    • 建立安全优先的开发文化
    • 为安全投资提供足够资源
    • 鼓励安全研究和漏洞报告
  2. 流程与规范
    • 制定详细的安全开发规范
    • 建立代码审查和审计流程
    • 实施变更管理和发布控制
  3. 应急响应机制
    • 制定安全事件响应计划
    • 建立快速响应团队
    • 准备资金恢复和用户赔偿方案

总结

重入攻击作为智能合约最危险的漏洞之一,已经造成了数十亿美元的损失。从早期的The DAO事件到现代DeFi协议的攻击,重入漏洞一直是安全研究者和开发者关注的焦点。

防御重入攻击需要多层次的策略,包括基础的Checks-Effects-Interactions模式、ReentrancyGuard机制、高级的形式化验证和AI驱动的检测技术。随着技术的发展,新型的防御机制正在不断涌现,为智能合约提供更强大的安全保障。

对于开发者来说,理解重入攻击的原理,掌握防御技术,遵循安全最佳实践是构建安全合约的关键。项目方则需要建立完善的安全治理体系,包括安全文化建设、开发流程规范和应急响应机制。

展望未来,随着语言级防护的增强、工具链的成熟、标准化的推进和基础设施的改进,重入攻击的风险将逐步降低。但与此同时,攻击者也在不断创新攻击方法,因此安全是一个持续的过程,需要社区的共同努力。

在Web3和DeFi快速发展的今天,安全已经成为项目成功的基础。通过采用科学的防御策略,结合最新的技术手段,我们可以构建更加安全、可靠的智能合约生态系统,为用户提供真正有价值的去中心化应用。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、重入攻击原理与威胁概述
    • 1.1 重入攻击的基本原理
    • 1.2 重入攻击的历史危害
    • 1.3 重入攻击的类型与变种
  • 二、重入攻击防御基础机制
    • 2.1 Checks-Effects-Interactions模式
    • 2.2 ReentrancyGuard机制详解
    • 2.3 函数锁定与状态管理
  • 三、高级重入防御技术
    • 3.1 可重入函数安全设计
    • 3.2 代理合约与升级合约的重入防护
    • 3.3 跨合约交互的安全模式
  • 四、2025年新型重入防御技术
    • 4.1 形式化验证的重入防护
    • 4.2 AI驱动的重入检测与防护
    • 4.3 区块链层重入防护机制
  • 五、重入攻击防御最佳实践
    • 5.1 开发阶段防御策略
    • 5.2 测试与验证策略
    • 5.3 部署与运行时监控
  • 六、重入攻击案例分析与修复
    • 6.1 The DAO事件深度分析
    • 6.2 Lendf.Me事件分析与启示
    • 6.3 DeFi协议重入防护演进
  • 七、未来重入防御趋势与建议
    • 7.1 技术发展趋势预测
    • 7.2 开发者安全建议
    • 7.3 项目方安全治理
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档