Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
イ良い日ンマを作る(USBストレージ容量偽装の手法) / USB Storage Capaci...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
shutingrz
February 04, 2023
Technology
0
2.3k
イ良い日ンマを作る(USBストレージ容量偽装の手法) / USB Storage Capacity Faking Techniques
shutingrz
February 04, 2023
Tweet
Share
More Decks by shutingrz
See All by shutingrz
Analyze AutoMotive ECU
shutingrz
3
4.3k
KnotResolverへの毒入れ~世にも珍しいKashpureff型攻撃~ / Hack_to_KnotResolver
shutingrz
0
640
DNSトンネリングの手法 / A technique of DNS tunneling (#ssmjp)
shutingrz
12
4k
JC3が教える! Gozi/DreamBot 判別法 / analysis_JC3_checksite
shutingrz
1
740
Other Decks in Technology
See All in Technology
マーケットプレイス版Oracle WebCenter Content For OCI
oracle4engineer
PRO
5
1.6k
OWASP Top 10:2025 リリースと 少しの日本語化にまつわる裏話
okdt
PRO
3
820
OCI Database Management サービス詳細
oracle4engineer
PRO
1
7.4k
Context Engineeringの取り組み
nutslove
0
360
2026年、サーバーレスの現在地 -「制約と戦う技術」から「当たり前の実行基盤」へ- /serverless2026
slsops
2
260
量子クラウドサービスの裏側 〜Deep Dive into OQTOPUS〜
oqtopus
0
130
Bill One 開発エンジニア 紹介資料
sansan33
PRO
5
17k
制約が導く迷わない設計 〜 信頼性と運用性を両立するマイナンバー管理システムの実践 〜
bwkw
3
970
茨城の思い出を振り返る ~CDKのセキュリティを添えて~ / 20260201 Mitsutoshi Matsuo
shift_evolve
PRO
1
340
外部キー制約の知っておいて欲しいこと - RDBMSを正しく使うために必要なこと / FOREIGN KEY Night
soudai
PRO
12
5.6k
データの整合性を保ちたいだけなんだ
shoheimitani
8
3.2k
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
15
93k
Featured
See All Featured
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
0
210
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Designing for Performance
lara
610
70k
The Pragmatic Product Professional
lauravandoore
37
7.1k
How to Talk to Developers About Accessibility
jct
2
130
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Music & Morning Musume
bryan
47
7.1k
Testing 201, or: Great Expectations
jmmastey
46
8k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Transcript
イ良い日ン マを作る しゅーと
イ良い日ン マとは • 2018年、突如ネット上に現れたmicroSD • アググンと呼ばれるものもある • 基本的に容量偽装系ストレージ • 2022年、SSDに形を変えて
パンピーを襲っている
容量偽装について • 実際のフラッシュ領域に対しての見せかけが異なる • 使えないわけではない • 返品期限までごまかすため? • 偽装方法には大きく2種類 •
無視タイプ • 上書きタイプ https://www.rescue-center.jp/elementary/vol54.html
目標 • 任意の容量だと嘘をつく • 1ペタバイトを目標 • 書き込めるけど一定のサイズを超えると異常動作を起こす • 無視または上書き動作
その前に
USBデバイスを作る方法
USBデバイスを作る方法 • USBデバイスICを使う • 汎用マイコン内蔵のUSB PHYを使う • USBエミュレーションツールを使う
Facedancer • USBデバイスのエミュレーションライブラリ(Python製!) • 対応ハードウェアのUSB APIを利用して機能を実現 • GreatFET Oneと呼ばれるボードが現在最も再現性が高い •
今年6月発売のLUNAに合わせて進化を遂げるらしい GreatFET One LUNA
facedancer-umass.py • イメージをマスストレージデバイスとして流し込むスクリプト • 以下で簡単にディスクイメージを作って接続できる • 接続するとターゲット上で認識される(未初期化) # 100MBサイズのディスクイメージ (何も初期化しない)
dd if=/dev/zero of=disk_100MB.bin bs=100M count=1 # スクリプト実行 ./legacy-applets/facedancer-umass.py ./disk_100MB.bin コントロール用 USBポート ターゲット用 USBポート
メモ: オンメモリだけで実現も • コードからfdを排除し全てdictに • プログラム終了時にはデータが失われる
任意の容量と嘘をつく
ストレージサイズはどう認識される? • UMS(USB Mass Storage)クラスではSCSIコマンドを利用する • Read Capacity(10)でセクタ数とブロックサイズを提示 • PCがそこからディスクのサイズを割り出す
Facedancerでの実装 • ブロックサイズは512バイト固定 • セクタ数は読み込まれるイメージから算出される →ここを変更すれば任意のサイズを宣言できる! • ただしコードが全て最大32bit LBA •
現状は2TiBまでのディスクしか対応しない (GPTであれば認識可能だが) • →64bit LBA対応に改造して問題を回避👏 https://github.com/shutingrz/Facedancer/commit/0fcd48586a1e20b568d6d11d3408c8e854dba1f8
未初期化状態の罠 • リムーバブルディスクだと未初期化を未初期化と認識しない • →全セクタを走査しパーティションを探してるっぽい?→遅い!! • Windowsでのフォーマット時にメタデータを 全セクタに書き込む→遅い!! • 10MBのディスク+FAT32で2分ちょっとかかる
• Facedancerで偽装する場合は事前にフォーマットしないと無理
手始めに100GBの仮想ディスクを初期化 • 以下のコマンドで事前にexFATでフォーマット • 問題なく100GBとしてマウントできた #100GBのスパースファイルを作成しGPT作成、exFATでフォーマット $truncate –s 100GB test.img
$parted –s test.img mklabel gpt mkpart primary ntfs 1MiB 100% print quit $sudo losetup –f –show test.img $sudo kpartx –a /dev/loop2 $sudo mkfs.exfat /dev/mapper/loop2p1 # スクリプト実行 $./legacy-applets/facedancer-umass.py ./test.img
調子に乗って2ペタバイト !? $truncate -s 2PB test.img truncate: failed to truncate
'test.img' at 2000000000000000 bytes: File too large
ext4の制限 • ext4 >このファイルシステムは、最初にLinuxカーネル2.6.19でスト レージ制限を拡張し、パフォーマンスを向上させるために使用さ れていました。 Ext2およびExt3と比較すると、Extファイルシス テムは標準の4Kブロックサイズを使用して、最大1EBのボ リュームサイズと最大16TBの単一ファイルサイズをサポートで きます。
btrfsの中にスパースファイル作成 • btrfsは16EBの単一ファイルをサポート • 10GBのbtrfsイメージを作りその中で2PBのディスクを作成 • うまくいった • あとはいつも通りGPTからのexFATのフォーマット $truncate
-s 10GB btr.img $mkfs.btrfs btr.img $sudo mount btr.img /mnt/target1 $ truncate -s 2PB /mnt/target1/test.img <- いけた! $ ls –la /mnt/target1/test.img -rw-r--r-- 1 user user 2000000000000000 Jan 25 01:46 <- 2PBのファイル /mnt/target1/test.img
2PBのUSBドライブを見よ! • 無事マウントに成功 • Facedancerの微修正が必要 • ただしマウント完了まで30分必要 • 全セクタを読み込むため •
こういうものなの? • 容量偽装はできたので、 時間かかる2PBは一旦封印
目標 • 任意の容量だと嘘をつく • 1ペタバイトを目標 • 書き込めるけど一定のサイズを超えると異常動作を起こす • 無視または上書き動作 💮
一定のサイズを超えると異常動作を起こす • 今はbtrfsの実サイズを超えたら書き込みエラーが発生するはず • アググン/イ良い日ン マは書き込み自体はできる • イ良い日ン マ実現までの道のり: •
4GBのディスクイメージを用意 • 32GBとみせかける • 書き込み要求セクタが4GBより上位の場合は書き込まない • 偽装と書き込み無視は全てFacedancer側で対応可能 • 特定セクタより上の場合はprint()するだけのコードを書いた↓
試した が・・・ • 転送速度が遅すぎて検証にならない • コントロールがwsl2のためUSB-IPで転送しているのも原因か • もっとディスクサイズを減らすことに 350 KB/s
というわけで見かけ32MBのディスク • ディスクイメージは16MB確保 • 15MB分のセクタを超える場合書き込みを行わないように
テストデータ • 1つあたり1.08MBのjpgファイル • 14枚目の途中で特定セクタに到達 する計算
デモ(1) • 途中で書き込みされなかった画像ファイル
デモ(2) • 事象発生時のログと空き容量
目標 • 任意の容量だと嘘をつく • 1ペタバイトを目標 • 書き込めるけど一定のサイズを超えると異常動作を起こす • 書き込み無視 💮
💮
まとめ • あくまでUSBエミュレーションを使ったものだができた • イ良い日ン マの作り方を完全に理解した • 実際にやるにはちゃんとしたICでのネイティブ実行が必要 • Pico
にUSBコントローラがあるのでTinyUSBライブラリで優勝?
おわり