限定額の承認と無制限承認では、実際のリスクにどんな違いがあるのか?なぜ多くのインターフェースがデフォルトで無制限になっているのか?
限定額の承認(例えば100トークンのみ)と無制限承認の違いは、その承認が悪用された場合に攻撃者が奪える上限にある。100トークンしか承認していなければ、対応するコントラクトが完全に侵害されたとしても、攻撃者が使える額は100トークンまでだ。無制限を承認していれば、攻撃者はそのトークンのウォレット残高すべてを奪うことができる。
多くのインターフェースが無制限の承認をデフォルトで要求するのは、主にユーザー体験のためである——取引ごとに金額が異なるたびに新たな承認が必要になれば、承認リクエストが絶えず表示され、頻繁に取引するユーザーにとって大きな障害となる。しかしこの設計は、「利便性」のコストを「単一のコントラクトが問題を起こした場合の曝露上限」に転嫁している。承認の瞬間、ユーザーは実際にはその取引に必要な分だけに額を手動で編集できるが、ほとんどの人はわざわざそうせず、デフォルトの無制限をそのままクリックしてしまう。
すでに無制限の承認をしてしまったが、そのプロトコルはこれまで問題なく運営されている場合、この古い承認は依然としてリスクなのか?
そうだ。しかも過小評価されやすいリスクである。なぜなら、そのトリガーは自分の手にあるのではなく、相手側にあるからだ。「プロトコルがこれまで問題なく運営されている」というのは、これまで何も起きていないことを示すだけであり、その承認自体が安全になったことを意味しない。コントラクトのコードがオンチェーンに存在し続け、あなたの承認が取り消されていない限り、その承認のリスク状態は、そのコントラクトが将来脆弱性を発見されるかどうか、あるいは(存在する場合)管理者権限が悪用されるかどうかに完全に依存している——そのどちらも、あなたがコントロールしたり事前に予測したりできるものではない。
より具体的な例えで言えば、これは何年も前に友人の家に合鍵を預けたようなものだ。その友人の家でこれまで何も起きていないからといって安全だということにはならず、単に「今のところ何も起きていない」というだけだ。本当に安心できるのは、相手の家で何か起きてから思い出すのではなく、自分自身がいつ鍵を回収するかを決めることである。
金額以外に、承認取り消しで注意すべき実務上の細かい点はあるか?例えば取り消しが現在使っているプロトコルに影響するようなことはあるか?
注意すべき一般的な実務上の落とし穴が2つある。第一に、実際にまだ使用しているプロトコルの承認を取り消すと、次回の取引が失敗する可能性があり、一部のステーキング状況ではすでにステーキングしたポジションへのアクセスにも影響しかねない。一括取り消しツールは便利だが、すべてを取り消す前に、リストにある各項目が現在使っているプロトコルかどうかを確認する方がよい。見覚えのない名前だからといって片っ端から取り消すのではなく——名前が見覚えないのは単に基盤となるコントラクト名がフロントエンドの表示名と一致していないだけの場合もあり、それは「使ったことがない」と同じではない。
第二に、取り消し自体もオンチェーン取引であり、複数の承認を一度に取り消す場合、イーサリアムメインネットでのガス代は急速に積み重なる可能性がある。思いついた都度1件ずつ取り消すのではなく、まとめて1回のセッションで処理する方が一般的にコスト効率が良い——繰り返しのガス代は思っている以上にかさむものだ。
今回初めて自分の承認リストを確認し、すっかり忘れていた項目が十数個見つかった場合、どのように優先順位をつければよいか?
2つの軸で優先順位をつけるとよい。1つは許可額の大きさ(無制限を限定額より優先)、もう1つはそのプロトコルに見覚えがあるかどうか、そして現在も正常に稼働しているかどうか(サービスが停止していたりコミュニティが消滅しているプロジェクトは優先的に取り消す。メンテナンスされていないコントラクトのリスクは時間とともに増える一方で減ることはないからだ)。
実務的には、まず「無制限額 + まったく覚えていない」項目を第一グループとしてリストアップする——これが最もリスクが高く、かつ最も判断しやすいグループだ。次に「無制限額 + 覚えているがもう使っていない」項目を処理する。最後に「限定額」の項目を扱う——このグループは最悪の事態が起きても曝露にはもともと上限があるため、それほど急がなくてよい。リスト全体を一度に片付ける必要はなく、リスクが最も高く判断コストが最も低いグループから処理するだけで、曝露を大幅に減らすことができる。
分散型取引所を使ったことがある、NFTをミントしたことがある、あるいはエアドロップを受け取ったことがある人なら、ウォレットの中にはおそらく自分でも忘れてしまった権限が眠っている——これはトークン承認(token approval)と呼ばれ、一度付与されると自動的には失効しない。それぞれが自分自身が署名した、期限なしの許可証であり、スマートコントラクトが好きなときにあなたのトークンを動かせる状態にしている。これこそが、資産盗難の被害者の多くが後になって調べると、秘密鍵は一度も漏洩していなかったと判明する理由である——それでもお金は消えていた。
分散型取引所でスワップする、マーケットプレイスでNFTを出品する、DeFiプロトコルと相互作用するたびに、ウォレットは「承認」リクエストをポップアップ表示する——これは、特定のスマートコントラクトが将来あなたの代わりに一定量(時には無制限)のトークンを使用できるようにする、オンチェーンの認可である。この設計自体は理にかなっている。すべての取引ごとに新しい認可を要求すれば、DeFiの利用体験は耐え難いほど煩雑になるだろう。問題は、一度承認が付与されると、その取引が「終わった」からといって自動的には失効しないことだ——手動で取り消すまで、無期限にオンチェーンに残り続ける。6か月前に使い、名前すらもう覚えていないプロトコルに、当時無制限の許可を与えていたなら、その承認は今も有効であり、秘密鍵が漏洩したことがあるかどうかとはまったく無関係に存在し続けている。
セキュリティ企業のデータによると、2026年第1四半期だけで承認悪用型(approval-based)攻撃による損失は6億ドルを超えた。この数字は攻撃者の技術が飛躍的に向上したことを反映しているのではなく、「古い承認」という攻撃対象領域そのものが体系的に悪用されていることを反映している。攻撃者はあなたのウォレットを直接突破する必要はなく、あなたがかつて承認し、忘れてしまったコントラクトを見つけるだけでよい。そのコントラクトに後で脆弱性が見つかったり、最初から悪意を持って設計されていたりすれば、攻撃者はあなたがすでに与えた許可額に対して直接使用できる——秘密鍵や復元フレーズには一切触れる必要がない。
現在最も広く使われているツールはRevoke.cashで、主要チェーンの大半をサポートしている。ウォレットを接続すると、現在有効なすべての承認——付与先(どのコントラクトか)、許可額(限定か無制限か)、作成日時——が一覧表示される。それぞれを個別に確認し、見覚えのないものや使わなくなったものを取り消すことができる。取り消し自体は通常のオンチェーン取引であり、ガス代が必要になる——イーサリアムメインネットでは高額になる可能性があるが、レイヤー2や他のチェーンでは通常わずか数セント程度である。MetaMaskユーザーは、追加のツールをインストールせずに、ウォレット自体に組み込まれたPortfolioページで承認管理を行うこともできる。Solanaのエコシステムは仕組みが異なり、ERC-20型の許可額方式ではなくデリゲート(delegate)ベースの権限モデルを採用しているため、Solana対応の専用取り消しツールが必要になる。
承認管理ツールが、ユーザーが積極的にセキュリティ支援を求めに行く場所になっているまさにその理由から、これらのツール自体もなりすましの主要な標的になっている——攻撃者はRevoke.cashのインターフェースをコピーし、似たようなドメイン名を使い、ユーザーがウォレットを接続した後、取り消しを装った悪意ある取引を「承認」させようとする。見分ける基準はシンプルだ。本物の取り消しでは、ウォレットの確認画面に許可額をゼロにする取引が表示される。もし代わりに、見覚えのない新しいコントラクトアドレスへの「承認」を求められたなら、それはもはや取り消しではなく、別の承認フィッシングである。これらのツールを使う前には必ず公式URLを手動で入力し、検索結果やメッセージ内のリンクに頼らないこと。
定期的な承認チェックを、定期的なパスワード更新と同じように扱うこと——毎月時間を取り、信頼できる、確認済みのツールでウォレットをスキャンし、見覚えのないものや使わなくなったものを取り消す。この習慣は何か問題が起きるまで待つ価値のあるものではない。承認悪用による損失の多くは、被害者が「有効期限:無期限」と書かれた許可証を、数か月あるいは数年前に付与したまま自分がまだ持ち続けていることに気づかず、あるプロトコルが攻撃を受けるか、攻撃者がまさにそうした休眠中の承認を探しに来るまで、問題に気づかなかったために発生している。