はじめに
『DApps開発入門』という本や色々記事を書いているかるでねです。
今回は、セキュリティについての連絡手段をコントラクトに暗号化して定義する仕組みを提案しているERC5437についてまとめていきます!
以下にまとめられているものを翻訳・要約・補足しながらまとめていきます。
他にも様々なEIPについてまとめています。
概要
ERC5437では、非対称暗号を用いた「セキュリティ通知用インターフェース」を導入する提案をしています。 具体的には、スマートコントラクトが公開鍵(非対称暗号の暗号鍵)と、セキュリティ通知の送付先(例えばメールアドレスやWebフォームURL)をインターフェース経由で公開します。
これにより、セキュリティ研究者は公開鍵を使って機密情報を暗号化し、安全な形で脆弱性の詳細を送信できるようになります。 通知の送信先は、暗号化された情報を受け取って復号し、対応を行うコントラクトの管理者や開発チームになります。
動機
現在、スマートコントラクトの管理者に対して、セキュリティ問題を報告するための「公式的な連絡手段」は標準化されていません。 そのため、脆弱性を発見したセキュリティ研究者がどこに、どのように報告すればよいか明確でなく、対応の遅れや情報漏洩のリスクが高まっています。
ERC5437で提案されているインターフェースを導入することで、開発者はセキュリティ報告専用の安全なチャネルを提供でき、研究者はそれを用いて暗号化された情報を安心して送信できます。 Ethereumや他のEVMベースのスマートコントラクト環境において、よりセキュアで信頼性の高いバグ報告の流れを構築することが目的です。
仕様
IEIP5437
interface IEIP5437 {
/// REQUIRED
function getSecurityContact(uint8 type, bytes memory data) public view
returns (
uint8 type,
bytes memory publicKey,
bytes memory extraData
);
/// OPTIONAL
// TODO consider remove if not needed before finalized
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 consider to make it a separate EIP
function bountyPolicy(uint256 id) public view returns(string, bytes memory extraData);
}イベント
SecurityContactChangedsetSecurityContact関数成功時に発行されるイベント。
OnSecurityNotificationsecurityNotify関数成功時に発行されるイベント。
関数
getSecurityContact
セキュリティ連絡先の情報を取得する関数。
function getSecurityContact(uint8 type, bytes memory data)
public view
returns (
uint8 type,
bytes memory publicKey,
bytes memory extraData
);type- 連絡先情報の形式を指定(
[0x10, 0x7f]の範囲が有効)。
- 連絡先情報の形式を指定(
publicKey- 指定された暗号方式の公開鍵。
extraData- 電子メールアドレスなどの追加情報。
例:
type = 0x10 は「GnuPG RSA/3072鍵+RFC2822形式のメールアドレス」であることを意味します。
setSecurityContact
function setSecurityContact(
uint8 type,
bytes memory publicKey,
bytes memory extraData
) public;セキュリティ連絡先を設定・更新する関数。
設定が成功した場合、SecurityContactChanged イベントを発行します。
securityNotify
function securityNotify(uint8 type, bytes memory data) public payable;スマートコントラクトに対してオンチェーンでセキュリティ通知を送信する関数。
成功した場合は OnSecurityNotification イベントを発行します。
bountyPolicy
function bountyPolicy(uint256 id) public view returns (string, bytes memory extraData);セキュリティバグ報告に対する報酬ポリシー(バグバウンティ)の情報を取得する関数。
id = 0- バウンティ全体の概要。
- それ以外の数字
- 個別ポリシー(報告範囲や条件など)。
戻り値はURI文字列で、任意のフォーマットでバウンティ内容が掲載されます。
条件
getSecurityContactの実装は必要です。- ERC165(インターフェース識別標準)への対応が必要です。
typeの値は[0x10, 0x7f]の範囲を使い、他は将来拡張用に予約されています。publicKeyのフォーマットは指定された暗号方式に準拠している必要があります。setSecurityContactやsecurityNotifyを実装する場合、それに対応するイベントの発行が必要です。
公開鍵の例
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQGNBGLzM2YBDADnCxAW/A0idvKNeQ6s/iYUeIIE+2mWmHcBGqLi0zrfz7pKWI+D
m6Hek51sg2c7ZlswPEp8KqANrj/CV1stXHF+KAZtYeFiAqpIZl1wtB6QgKYWGsJf
sXjBU3duLzLut2yvTfbEZsWAvrEaDjlXywdpboorHvfTE2vOvI6iGcjdh7PW7W7g
IGzlL6ukLGG7y9FUO2dSMjCR/tWMLCupnDDLN2cUHnfEnHZ34FMd61NxcHLC7cIk
P8xkFt8GCxURniTjqI5HAB8bGfR34kflVpr2+iKD5e+vQxcWK7vB443nruVf8osn
udDF8Z6mgl7bKBbGyYH58QsVlmZ8g3E4YaMKjpwOzEK3V2R8Yh4ETdr670ZCRrIz
QWVkibGgmQ3J/9RYps5Hfqpj4wV60Bsh1xUIJEIAs3ubMt7Z5JYFeze7VlXGlwot
P+SnAfKzlZT4CDEl2LEEDrbpnpOEdp0x9hYsEaXTxBGSpTDaxP2MyhW3u6pYeehG
oD0UVTLjWgU+6akAEQEAAbQjc29tZXJlYWxuYW1lIDxncGcubG9jYWwuZ2VuQHp6
bi5pbT6JAdQEEwEIAD4WIQTDk/9jzRZ+lU2cY8rSVJNbud1lrQUCYvMzZgIbAwUJ
EswDAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDSVJNbud1lraulDACqFbQg
e9hfoK17UcPVz/u4ZnwmFd9zFAWSYkGqrK9XMvz0R8pr7Y3Dp5hfvaptqID/lHhA
2oPEZ1ViIYDBcqG9WoWjCOYNoIosEAczrvf8YtUC2MHI+5DdYHtST74jDLuWMw3U
AbBXHds3KcRY5/j01kqqi4uwsMBCYyH3Jl3IwjKgy0KDBbuQakvaHPmNnt81ayvZ
ucdsNB9n/JMDxUWNCcySR+cllW4mk68pdiuK5qw0JMaoUjHFoWsgMTbFSlAV/lre
qu8MnrLSs5iPvvaJ3uDOuYROB2FsbvWxayfAAVS1iZf2vQFBJPnDwDdYoPNYMjLp
s2SfU02MVRGp3wanbtvM52uP42SLLNjBqUvJV03/QwfxCRejgAJOBn+iaOxP9NOe
qfQdKzYPbA9FohdkL9991n21XBZcZzAgF9RyU9IZAPAnwZyex1zfzJsUp/HrjhP8
Ljs8MIcjIlmpLk66TmJte4dN5eML1bpohmfMX8k0ILESLSUhxEg1JBNYIDK5AY0E
YvMzZgEMALnIkONpqCkV+yaP8Tb8TBjmM+3TioJQROViINUQZh6lZM3/M+DPxAWZ
r0MIh1a3+o+ThlZ70tlS67w3Sjd62sWAFzALzW4F+gTqjBTh6LURDqDV8OXUrggA
SKK222aDP+Fr21h/TtPLeyDvcgm8Xvi4Cy7Jmf5CfT5jDio7a+FyFBNlTFSVqzLM
TgFOkUFBg8kJKvDjWIrS2fcTkELwZ8+IlQ52YbrXwbDar843x1fRmsY+x9nnuGuP
RYn1U4Jbptu2pEkG5q94jzUzTkGZHCzBJY7a8mtvS0mLqIE0Se1p+HFLY76Rma/F
HB6J4JNOTzBZ0/1FVvUOcMkjuZ2dX81qoCZ8NP6eafzKvNYZrGa5NJnjWO1ag5jQ
D8qHuOwxs8Fy9evmkwAVl51evLFNT532I4LK0zHSbF8MccZjpEFMSKwalKJn02Ml
yTd+ljYLf8SKMOLVps8kc4VyMR1lz0PwSpKDFOmkC1LRURpM7UTtCK+/RFg1OLyQ
SKBmdI37KQARAQABiQG8BBgBCAAmFiEEw5P/Y80WfpVNnGPK0lSTW7ndZa0FAmLz
M2YCGwwFCRLMAwAACgkQ0lSTW7ndZa2oFgv8DAxHtRZchTvjxtdLhQEUSHt80JCQ
zgHd7OUI9EU3K+oDj9AKtKZF1fqMlQoOskgBsLy/xpWwyhatv2ONLtHSjYDkZ7qs
jsXshqpuvJ3X00Yn9PXG1Z1jKl7rzy2/0DnQ8aFP+gktfu2Oat4uIu4YSqRsVW/Z
sbdTsW3T4E6Uf0qUKDf49mK3Y2nhTwY0YZqJnuQkSuUvpuM5a/4zSoaIRz+vSNjX
MoXUIK/f8UnWABPm90OCptTMTzXCC1UXEHTNm6iBJThFiq3GeLZH+GnIola5KLO1
+YbsFEchLfLZ27pWGfIbyppvsuQmrHef+J3g6sXybOWDHVYr3Za1fzxQVIbwoIEe
ndKG0bu7ZAi2b/c8uH/wHT5IvtfzHLeSTjDqG8UyLTnaDxHQZIE9JIzWSQ1DSoNC
YrU7CQtL+/HRpiGFHfClaXln8VWkjnUvp+Fg1ZPtE1t/SKddZ7m29Hd9nzUc0OQW
MOA+HDqgA3a9kWbQKSloORq4unft1eu/FCra
=O6Bf
-----END PGP PUBLIC KEY BLOCK-----公開鍵の形式としてRFC 20(PGP ASCII Armor形式)を想定したRSA/3072ビット鍵の例が示されています。 これはGnuPGで生成され、メール通知と連携するために使われます。
このようにして、スマートコントラクトがセキュリティ通報を正式かつ暗号的に安全な方法で受け取るインターフェースを提供することができます。
補足
ERC5437では、セキュリティ連絡先の情報を扱う方式として、シンプルなGPG(GNU Privacy Guard)ベースの暗号化方式と電子メールアドレスを採用しています。 これは、実装や運用をできる限り簡易に保つことを目的としています。
将来的には、新しい暗号方式や通知手段を追加する提案(EIP)が登場することも見越されており、それに対応できるよう柔軟な設計が取られています。
また、以下のような理由からいくつかの補助的機能が導入されています。
setSecurityContactの追加は、暗号鍵の有効期限切れや運用変更などに応じて、連絡先を更新可能にするためです。securityNotifyをpayableにしているのは、脆弱性報告に対してステーキングを伴う設計も可能にするためです。- 例えば、報告の真剣度を担保する担保金のような用途です。
bountyPolicyとextraDataフィールドを導入することで、今後の拡張(報酬体系や通知方法など)に柔軟に対応できる構造になっています。
互換性
現状、OpenZeppelinなどが採用している方法では、セキュリティ連絡先はソースコード内に平文で次のように記述されています。
/// @custom:security-contact some-user@some-domain.comERC5437は、既存の平文ベースの方法に加えて、暗号化された安全な報告チャネルを提供する新たな標準を導入する提案です。 既存の方法と併用することが推奨されています。
セキュリティ
ERC5437を実装する際には、以下のような暗号通信のベストプラクティスに従う必要があります。
- セキュリティ連絡先情報を常に最新に保つこと。
- 暗号鍵は推奨される期限内で定期的にローテーションすること。
- 通報チャネル(例:メールアドレスなど)は、通知を迅速に受け取れるよう定期的に監視すること。
これらの運用が適切に行われていない場合、セキュリティ報告手段が意味を成さず、脆弱性の発見や対応が遅れるリスクがあります。 そのため、実装だけでなく継続的な運用管理も含めたセキュリティ対策が求められます。
引用
Zainan Zhou (@xinbenlv), "ERC-5437: Security Contact Interface [DRAFT]," Ethereum Improvement Proposals, no. 5437, August 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-5437.
最後に
今回は「セキュリティについての連絡手段をコントラクトに暗号化して定義する仕組みを提案しているERC5437」についてまとめてきました! いかがだったでしょうか?
質問などがある方は以下のTwitterのDMなどからお気軽に質問してください!
他の媒体でも情報発信しているのでぜひ他も見ていってください!

