ERC-5437: 安全联络人接口
使用非对称加密的安全通知接口
Authors | Zainan Zhou (@xinbenlv) |
---|---|
Created | 2022-08-09 |
Discussion Link | https://ethereum-magicians.org/t/erc-interface-for-security-contract/10303 |
Requires | EIP-165 |
摘要
使用非对称加密的安全通知接口。该接口公开一个非对称加密密钥和一个传递目的地。
动机
目前,没有一致的方法来指定一个官方渠道,供安全研究人员向智能合约维护者报告安全问题。
规范
本文档中的关键词“必须”、“禁止”、“需要”、“应该”、“不应该”、“推荐”、“可以”和“可选”应按照 RFC 2119 中的描述进行解释。
interface IEIP5437 {
/// REQUIRED (必需)
function getSecurityContact(uint8 type, bytes memory data) public view
returns (
uint8 type,
bytes memory publicKey,
bytes memory extraData
);
/// OPTIONAL (可选)
// TODO 考虑在最终确定之前移除,如果不需要
function setSecurityContact(
uint8 type,
bytes memory publicKey,
bytes memory extraData) public;
event SecurityContactChanged(uint8 type, bytes memory publicKeyForEncryption, bytes memory extraData);
/// OPTIONAL (可选)
function securityNotify(uint8 type, bytes memory data) public payable;
/// OPTIONAL (可选)
event OnSecurityNotification(uint8 type, bytes memory sourceData, uint256 value);
/// OPTIONAL (可选)
// TODO 考虑将其作为一个单独的 EIP
function bountyPolicy(uint256 id) public view returns(string, bytes memory extraData);
}
- 兼容的接口必须实现
getSecurityContact
方法。
type
是一个字节的数据,有效范围为 [0x10, 0x7f]
。范围 [0x00, 0x0f]
和 [0x80, 0xff]
保留用于未来扩展。
type
指示 publicKey
和 extraData
的格式,如下所示
| Type | Encryption scheme (加密方案) | extraData | ——-|————————————-|————————————————– | 0x10 | GnuPG - RSA/3072 | Email address(es) (电子邮件地址) 以 RFC 2822 格式编码 | ————————————————————————————————
可以通过未来的 EIP 提出此表的新版本,方法是指定一个新的 type
编号。
- 从
getSecurityContact
返回的publicKey
必须遵循上表中指定的加密方案。
以下是使用 RSA/3072
的 publicKey
示例,该密钥通过 RFC 20 ASCII 编码的公钥字符串中的 GnuPG 生成:
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
MOA+HDqgA3a9kWbQKSloORq4unft1eu/FCra
=O6Bf
-----END PGP PUBLIC KEY BLOCK-----
-
如果实现了
setSecurityContact
并且对它的调用已成功设置了新的安全联系人,则必须发出一个SecurityContactChanged
事件,其中包含与setSecurityContact
相同的传入参数 -
另外,建议实现一个链上安全通知方法
securityNotify
以接收链上安全通知。如果它被实现并且调用成功,则必须发出一个具有相同传入参数数据的OnSecurityNotification
。 -
兼容的接口必须实现 EIP-165。
-
建议通过
bountyPolicy
方法设置赏金策略。id = 0
保留用于完整概述,而其他数字用于不同的个人赏金策略。 返回的字符串将是赏金策略内容的 URI。 没有指定赏金政策的特定格式。
理由
- 为了简单起见,此 EIP 使用给定的加密方案指定了一个简单的 GPG 方案,并使用电子邮件地址作为联系方式。 未来的 EIP 可能会指定新的加密方案或传输方法。
- 此 EIP 添加了一个可选方法
setSecurityContact
来设置安全联系人,因为它可能会因加密密钥过期等情况而发生变化。 - 此 EIP 显式地将
securityNotify
标记为payable
,以便允许实施者设置质押金额来报告安全漏洞。 - 此 EIP 通过添加
bountyPolicy
和extraData
字段,允许未来进行扩展。 这些字段的附加值可能会在未来的 EIP 中添加。
向后兼容性
目前,OpenZeppelin 等现有解决方案在源代码中使用明文
/// @custom:security-contact some-user@some-domain.com
建议新版本的智能合约除了传统的 @custom:security-contact
方法外,还采用此 EIP。
安全注意事项
实施者应正确遵循加密方案要求的安全措施,以确 Chosen 通信频道的安全性。 一些最佳实践如下:
- 保持安全联系人信息最新;
- 按照最佳实践建议的周期轮换加密密钥;
- 定期监视频道,以便及时收到通知。
版权
在 CC0 下放弃版权和相关权利。
Citation
Please cite this document as:
Zainan Zhou (@xinbenlv), "ERC-5437: 安全联络人接口 [DRAFT]," Ethereum Improvement Proposals, no. 5437, August 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-5437.