Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
イ良い日ンマを作る(USBストレージ容量偽装の手法) / USB Storage Capaci...
Search
shutingrz
February 04, 2023
Technology
0
2.2k
イ良い日ンマを作る(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
4k
KnotResolverへの毒入れ~世にも珍しいKashpureff型攻撃~ / Hack_to_KnotResolver
shutingrz
0
630
DNSトンネリングの手法 / A technique of DNS tunneling (#ssmjp)
shutingrz
12
3.9k
JC3が教える! Gozi/DreamBot 判別法 / analysis_JC3_checksite
shutingrz
1
730
Other Decks in Technology
See All in Technology
タグ付きユニオン型を便利に使うテクニックとその注意点
uhyo
2
420
Multimodal AI Driving Solutions to Societal Challenges
keio_smilab
PRO
1
110
【保存版】「ガチャ」からの脱却:Gemini × Veoで作る、意図を反映するAI動画制作ワークフロー
nekoailab
0
130
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
37k
MySQL AIとMySQL Studioを使ってみよう
ikomachi226
0
130
Active Directory 勉強会 第 6 回目 Active Directory セキュリティについて学ぶ回
eurekaberry
16
5.7k
インフラ室事例集
mixi_engineers
PRO
2
200
Symfony AI in Action
el_stoffel
2
340
AI/MLのマルチテナント基盤を支えるコンテナ技術
pfn
PRO
4
650
IaC を使いたくないけどポリシー管理をどうにかしたい
kazzpapa3
1
210
freeeにおけるファンクションを超えた一気通貫でのAI活用
jaxx2104
3
380
Claude Code Getting Started Guide(en)
oikon48
0
110
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.4k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
36
6.2k
Git: the NoSQL Database
bkeepers
PRO
432
66k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.2k
Building Adaptive Systems
keathley
44
2.9k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.1k
How to Think Like a Performance Engineer
csswizardry
28
2.3k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Designing for humans not robots
tammielis
254
26k
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ライブラリで優勝?
おわり