
技術解説:チェーン上での新規プロジェクト参加の裏の裏、大規模なRug Pullの手口を解明
TechFlow厳選深潮セレクト

技術解説:チェーン上での新規プロジェクト参加の裏の裏、大規模なRug Pullの手口を解明
本稿では、その中の1つの事例を取り上げ、この脱出詐欺の詳細について詳しく説明する。
執筆:CertiK
最近、CertiKのセキュリティ専門チームは、「Rug Pull(退出詐欺)」と呼ばれる同じ手口の攻撃を頻繁に検出しています。
詳細な調査を行った結果、同様の手法で行われた複数の事件がすべて同じグループによって実行されており、最終的に200を超えるトークンに関連するRug Pullが確認されました。これは、大規模かつ自動化された「Rug Pull」による資産収奪を行うハッカーグループの存在を示唆しています。
これらのRug Pullでは、攻撃者は新しいERC20トークンを作成し、事前にマイニングしたトークンと一定量のWETHを使用してUniswap V2の流動性プールを構築します。
チェーン上の新規上場取引ロボットやユーザーがその流動性プールで一定回数新トークンを購入すると、攻撃者は実際には存在しない追加のトークンを利用して、プール内のWETHをすべて引き出すのです。
攻撃者が生成したこれらのトークンは総供給量(totalSupply)に反映されず、Transferイベントも発生しないため、Etherscan上では見えず、外部からは感知が困難です。
攻撃者は隠蔽性を考慮するだけでなく、初歩的な技術知識を持つユーザー(Etherscanを確認するレベル)を安心させるための「ダミー問題」まで用意しており、真の目的を隠す巧妙な仕組みになっています……
詐欺の内部構造
ここでは一例を取り上げ、このRug Pullの詳細を解説します。
我々が検出したのは、攻撃者が大量の不正トークンを使って流動性プールを枯渇させ、利益を得る最終取引です。この取引では、プロジェクト側が約416兆個のMUMIトークンを使用して約9.736 WETHを獲得し、プールの流動性を完全に枯渇させました。
しかし、この取引は詐欺の最後の一手に過ぎません。全体像を理解するには、それ以前のプロセスを遡る必要があります。
トークンのデプロイ
3月6日午前7時52分(UTC時間、以下同様)、攻撃者アドレス(0x8AF8)は「MUMI」(正式名称:MultiMixer AI)というERC20トークン(アドレス:0x4894)をデプロイし、4億2069万個のトークンを事前にマイニングし、すべてデプロイ者のアドレスに割り当てました。

事前マイニングされた数量は、スマートコントラクトのソースコードと一致しています。

流動性の追加
8時ちょうど(トークン作成から8分後)、攻撃者アドレス(0x8AF8)は流動性の追加を開始しました。
攻撃者アドレス(0x8AF8)は、トークンコントラクト内のopenTrading関数を呼び出し、Uniswap V2 Factoryを通じてMUMI-WETHの流動性プールを作成。全量の事前マイニングトークンと3ETHをプールに投入し、約1.036個のLPトークンを取得しました。


取引の詳細を見ると、元々流動性に追加されるはずだった4億2069万個のトークンのうち、約6300万個が再びトークンコントラクト(アドレス0x4894)に戻されています。コントラクトコードを確認すると、すべての送金に対して手数料が課され、その手数料の受け取り先はトークンコントラクト自体になっていることがわかります(具体的な実装は「_transfer関数」内)。

奇妙なことに、コントラクト内には税収アドレス0x7ffbが設定されているにもかかわらず、実際の手数料はトークンコントラクト自体に送られています。

そのため、実際に流動性プールに追加されたMUMIの数量は手数料控除後の約3億5758万個であり、当初の4億2069万個ではありません。
流動性のロック
8時1分(流動性プール作成から1分後)、攻撃者アドレス(0x8AF8)は取得した1.036個のLPトークンをすべてロックしました。

LPがロックされれば、理論上、攻撃者アドレス(0x8AF8)が保有するすべてのMUMIトークンは流動性プール内にロックされることになり、流動性の撤去によるRug Pullができなくなるはずです。
多くのプロジェクトがLPをロックするのは、投資家に「逃げない」という信頼を与えるためですが、本当にそうでしょうか? 明らかにこのケースでは違います。続けて分析しましょう。
Rug Pull
8時10分、新たな攻撃者アドレス②(0x9DF4)が登場し、トークンコントラクト内で宣言されていた税収アドレス0x7ffbのコントラクトをデプロイしました。

ここで注目すべき点が3つあります:
1. 税収アドレスをデプロイしたアドレスとトークンをデプロイしたアドレスは異なる。これは、各操作間のアドレス関連性を意図的に弱め、トレーサビリティを難しくしている可能性がある
2. 税収アドレスのコントラクトはオープンソースではないため、中身に隠された悪意ある操作が含まれている可能性がある
3. 税収アドレスのコントラクトはトークンコントラクトより後にデプロイされているが、トークンコントラクト内ではすでにアドレスがハードコードされている。つまり、CREATE命令により、デプロイアドレスとnonceが決まれば、コントラクトアドレスは事前に計算可能であるため、攻撃者はあらかじめシミュレーションでアドレスを算出していた
実際、多くのRug Pullは税収アドレスを通じて行われており、そのデプロイパターンは上記の1、2の特徴に合致します。
午前11時(トークン作成から3時間後)、攻撃者アドレス②(0x9DF4)がRug Pullを実行しました。彼は税収コントラクト(0x77fb)の「swapExactETHForTokens」メソッドを呼び出し、約416兆個のMUMIトークンを約9.736 ETHと交換し、プールの流動性を完全に枯渇させました。

税収コントラクト(0x77fb)は非公開のため、バイトコードを逆コンパイルしました。結果は以下の通りです:
https://app.dedaub.com/decompile?md5=01e2888c7691219bb7ea8c6b6befe11c
税収コントラクト(0x77fb)の「swapExactETHForTokens」関数の逆コンパイルコードを確認すると、この関数はUniswapV2ルーターを通じて、呼び出し側が指定した数量「xt」のMUMIトークンをETHに交換し、そのETHを税収アドレス内の「_manualSwap」アドレスに送信するものであることがわかりました。



_manualSwapアドレスはストレージ位置0x0にあり、JSON-RPCのgetStorageAtコマンドで照会したところ、このアドレスは税収コントラクト(0x77fb)のデプロイ者、つまり攻撃者②(0x9DF4)であることが判明しました。

今回のRug Pull取引の入力パラメータ「xt」は420,690,000,000,000,000,000,000であり、これはMUMIトークンの小数点以下9桁(decimal=9)を考慮すると、約420兆個のMUMIトークンに相当します。

つまり、プロジェクト側は約420兆個のMUMIを使って流動性プールのWETHをすべて吸い上げ、Rug Pullを完了させたのです。
しかし、最も重要な疑問があります。税収コントラクト(0x77fb)はどこからそんなに大量のMUMIトークンを手に入れたのか?
前述の通り、MUMIトークンの総供給量はデプロイ時に4億2069万個であり、Rug Pull後も変化していません(下図参照。表示値420,690,000,000,000,000はdecimal=9を考慮)。税収コントラクト(0x77fb)が保有する420兆個という数字はまるで空中から出現したかのようです。なお、0x77fbはそもそも手数料の受取アドレスとして使用されておらず、手数料はトークンコントラクト自体が受け取っていました。

手口の解明
税収コントラクトのトークンの出所
税収コントラクト(0x7ffb)のトークンの出所を調べるため、ERC20の転送履歴を確認しました。

結果、0x77fbに関する6件の転送イベントすべてが「送金のみ」であり、MUMIトークンの「入金」イベントは一切ありません。一見、税収コントラクト(0x7ffb)のトークンは本当に空中から現れたように見えます。
つまり、税収コントラクト(0x7ffb)に突如現れた巨額のMUMIトークンには次の2つの特徴があります:
1. MUMIコントラクトのtotalSupplyに影響を与えていない
2. トークン増加時にTransferイベントが発生していない
結論は明らかです。MUMIトークンコントラクトには必ず「バックドア」が存在し、balance変数を直接書き換えながら、totalSupplyの更新もTransferイベントの発火も行っていないのです。
つまり、これは標準的ではなく、悪意のあるERC20トークンの実装であり、ユーザーは総供給量やイベントからプロジェクト側が秘密裏にトークンを増刷していることを認識できません。
これを検証するため、MUMIトークンコントラクトのソースコードで「balance」をキーワード検索しました。

すると、private関数「swapTokensForEth」が存在し、引数tokenAmountを受け取り、その関数の5行目で、_taxWallet(税収アドレス0x7ffb)のMUMI残高をtokenAmount × 10**_decimals(=tokenAmountの10億倍)に直接設定していることがわかりました。その後、流動性プールからtokenAmount分のMUMIをETHに交換し、そのETHをトークンコントラクト(0x4894)に保管します。
次に「swapTokenForEth」をキーワード検索。

「swapTokenForEth」関数は「_transfer」関数内で呼び出されており、その条件は以下の通りです:
1. 送金先(to)がMUMI-WETH流動性プールであること
2. 他のアドレスが流動性プールでMUMIを5回以上購入した場合にのみ発動
3. tokenAmountは、コントラクトが保有するMUMI残高と_maxTaxSwapの小さい方


つまり、コントラクトはユーザーがプールでWETHからMUMIを5回以上交換した時点で、税収アドレスに巨額のトークンを秘密裏に生成し、一部をETHに交換してトークンコントラクトに保管するのです。
一方で、プロジェクト側は表面上「定期的に手数料をETHに交換している」と見せかけ、これが利益源だとユーザーに錯覚させます。
一方で、真の目的はユーザーの取引が5回を超えた瞬間に残高を直接書き換え、流動性プールを完全に空にすることにあります。
利益の回収方法
「swapTokenForEth」関数実行後、「_transfer」関数はさらにsendETHToFeeを呼び出し、トークンコントラクト内のETHを税収コントラクト(0x77fb)に送信します。

税収コントラクト(0x77fb)内のETHは、コントラクト内に実装された「rescue」関数で引き出せます。

ここで、Rug Pullの最終取引における交換記録を再確認します。

この取引では2回の交換が行われています。1回目は約416万個のMUMIで0.349 ETH、2回目は約416兆個のMUMIで9.368 ETH。2回目の交換がまさに税収コントラクト(0x7ffb)内の「swapExactETHForTokens」関数によるものであり、入力パラメータの420兆個と一致しない理由は、一部のトークンが手数料としてトークンコントラクト(0x4894)に送られたためです(下図参照)。

一方、1回目の交換は、2回目の交換中にルーターにトークンが送られる際に、コントラクト内のバックドア条件が満たされ、自動的に発動した交換であり、本質的な操作ではありません。
背後にいる大物
上記から、MUMIトークンはデプロイから流動性追加、Rug Pullまでわずか約3時間という短期間で完結しています。コストは約6.5ETH未満(3ETHを流動性に投入、3ETHでMUMIを誘導購入、0.5ETH未満をガス代)に対し、得られた利益は9.7ETHで、利益率は50%を超えています。
攻撃者がETHでMUMIを購入した取引は5件ありますが、これらは前述していません。取引情報は以下の通りです:
-
https://etherscan.io/tx/0x62a59ba219e9b2b6ac14a1c35cb99a5683538379235a68b3a607182d7c814817
-
https://etherscan.io/tx/0x0c9af78f983aba6fef85bf2ecccd6cd68a5a5d4e5ef3a4b1e94fb10898fa597e
-
https://etherscan.io/tx/0xc0a048e993409d0d68450db6ff3fdc1f13474314c49b734bac3f1b3e0ef39525
-
https://etherscan.io/tx/0x9874c19cedafec351939a570ef392140c46a7f7da89b8d125cabc14dc54e7306
-
https://etherscan.io/tx/0x9ee3928dc782e54eb99f907fcdddc9fe6232b969a080bc79caa53ca143736f75
流動性操作を行ったEOAアドレスを分析した結果、多くがチェーン上の「新規上場取引ロボット」であることがわかりました。また、この詐欺の高速な進行パターンから、標的はまさにこれらの活発な新規上場ロボットやスクリプトであると考えられます。
したがって、一見不要に見える複雑なコントラクト設計、デプロイ手順、流動性ロックプロセス、さらには攻撃者アドレスがETHでMUMIを積極的に購入する行動などは、すべて新規上場ロボットの詐欺検知プログラムを騙すための偽装行為です。
資金の流れを追跡した結果、得られた利益はすべて攻撃者アドレス②(0x9dF4)から資金集約アドレス(0xDF1a)に送られていたことがわかりました。

実は、最近検出された多数のRug Pullの初期資金源と最終的な資金行き先はすべてこのアドレスに集中しています。そこで、このアドレスの取引を分析・統計しました。
その結果、このアドレスは約2ヶ月前から活動を始め、現在までに7,000件以上の取引を行い、200以上のトークンと相互作用していることがわかりました。
その中の約40種類のトークンの取引記録を分析したところ、ほぼすべてのトークンにおいて、最終的に総供給量を大きく超える数量でETHを交換する取引があり、流動性プールが枯渇しており、Rug Pullまでの期間も非常に短いことがわかりました。
一部のトークン(例:名煙中華)のデプロイ取引は以下の通りです:
https://etherscan.io/tx/0x324d7c133f079a2318c892ee49a2bcf1cbe9b20a2f5a1f36948641a902a83e17

https://etherscan.io/tx/0x0ca861513dc68eaef3017e7118e7538d999f9b4a53e1b477f1f1ce07d982dc3f

よって、このアドレスは実質的に大規模な自動化された「Rug Pull収穫機」であり、その標的はチェーン上の新規上場ロボットであると断定できます。
このアドレスは現在も活動中です。
最後に
もしトークンがmintされる際にtotalSupplyが更新されず、Transferイベントも発生しない場合、プロジェクト側が秘密裏にトークンを増刷しているかどうかをユーザーが感知することは極めて困難になります。これにより、「トークンの安全性はプロジェクト側の誠実さに完全に依存する」という状況がさらに深刻化します。
したがって、既存のトークンメカニズムの改善、あるいはトークン総量の有効な検出スキームの導入を検討する必要があり、トークン数量の変更を真正に透明かつ公開にする必要があります。現状のようにイベントに依存して状態変化を把握するだけでは不十分です。
そして忘れてはいけないのは、人々の詐欺への警戒心が高まる一方で、攻撃者の反検知技術も進化しているということです。これは終わりのない継続的な戦いであり、常に学び続け、考え続けることでしか、この戦いの中で自身を守ることはできません。
TechFlow公式コミュニティへようこそ
Telegram購読グループ:https://t.me/TechFlowDaily
Twitter公式アカウント:https://x.com/TechFlowPost
Twitter英語アカウント:https://x.com/BlockFlow_News














