solidity-security は何をしますか?
スマートコントラクトのセキュリティベストプラクティスを習得し、一般的な脆弱性を防ぎ、安全なSolidityパターンを実装します。スマートコントラクトの作成、既存のコントラクトの監査、またはブロックチェーンアプリケーションのセキュリティ対策の実装時に使用します。
セキュリティの原則
- 最小権限の原則: コントラクトの機能へのアクセスを必要最低限に制限します。
- 防御的プログラミング: すべての入力を検証し、失敗に対して適切に処理します。
- フェイルセーフ設計: 問題発生時にデフォルトで安全な状態に設計します。
- 経済的セキュリティ: 悪意ある行動に対して経済的インセンティブを考慮します。
一般的な脆弱性と対策
| 脆弱性 | 説明 | 対策 |
|---|---|---|
| 再利用可能性攻撃 | 悪意あるコントラクトが、呼び出し元のコントラクトの関数を再帰的に呼び出す攻撃 | Checks-Effects-Interactionsパターンの使用、ReentrancyGuardの導入 |
| 整数オーバーフロー | 算術演算が最大値を超えると予期しない動作が発生 | Solidity 0.8以降の自動チェック、またはSafeMathの使用 |
| アクセス制御の欠如 | 機密関数への無制限アクセス | OpenZeppelinのOwnableやAccessControlの使用 |
| フロントランニング | トランザクションの順序操作による不正利益 | Comit-Revealスキーム、Submarine Sendsの使用 |
| タイムスタンプ依存 | ブロックタイムスタンプの操作による脆弱性 | ブロック番号や外部オラクルの使用 |
| ガス不足攻撃 | ループや複雑な処理によるガス制限超過 | プルベースの支払い、バッチ処理の制限 |
安全なパターン
Checks-Effects-Interactionsパターン
function withdraw(uint256 amount) public {
// チェック
require(balances[msg.sender] >= amount, "残高不足");
// 影響
balances[msg.sender] -= amount;
// 相互作用
(bool success, ) = msg.sender.call{value: amount}("");
require(success, "送金失敗");
}
緊急停止メカニズム
import "@openzeppelin/contracts/security/Pausable.sol";
contract MyContract is Pausable {
function sensitiveFunction() public whenNotPaused {
// 安全な処理
}
}
プルベースの支払い
mapping(address => uint256) public pendingWithdrawals;
function withdraw() public {
uint256 amount = pendingWithdrawals[msg.sender];
pendingWithdrawals[msg.sender] = 0;
(bool success, ) = msg.sender.call{value: amount}("");
require(success, "送金失敗");
}
監査チェックリスト
- すべての外部呼び出しが安全に処理されているか?
- アクセス制御が適切に実装されているか?
- 算術演算が安全に行われているか?
- ストレージの書き込みが適切に行われているか?
- イベントが正しく発行されているか?
- フロントランニング対策が施されているか?
- ガス制限に配慮した設計か?
- 緊急停止機構が実装されているか?
- アップグレード可能性が安全に設計されているか?
- 依存ライブラリが最新かつ監査済みか?
推奨される静的解析ツール
- Slither: Solidity用静的解析フレームワーク
- Mythril: EVMバイトコード用セキュリティ解析ツール
- Echidna: プロパティベースのファジングツール
- Foundry: 高速テストとファジングを統合
外部リソース
貢献
GitHubでプルリクエストを作成して、新しいパターンや改善点を提案してください。セキュリティ研究は常に進化しています。