【自動運転近辺】LiDARセンサでDOOMをプレイしよう!!!
現在、日本のみならず全世界で自動運転システムの開発競争が行われています。カリフォルニア州や武漢市などでは既にレベル4相当(ドライバー不要)の自動運転車が多く走っています。
自動運転システムの中核となるセンサの一つにLiDARという3次元センサがあります。今回はこのLiDARの脆弱性を用いて出力点群上でDoomをプレイしてみよう、というものです。
Doomとは
Doomは1993年、MS-DOS向けに発売されたFPSゲームです。発売当初から人気を誇り、シリーズ累計では1000万本以上売り上げたとされています。
そんなFPSの草分け的存在であるDoomですが、開発視点でも大きな特徴があります。それはゲームエンジンのソースコードが公開されているというものです。
コードはGPL-2.0でライセンスされ、有志により様々な環境で動作するようになっています。
Doomを動かすということ
画面あるところにDoomあり。
Doomはその移植性とグラフィック的なインパクトから様々なPCに限らない多くの機械に移植されています。
- 関数電卓
- デジカメ
- iPod
- ATM
- Apple Watch
- オシロスコープ
- 冷蔵庫
- トラクター
- 歯ブラシ
- …
かなり見境なくDoomを動かされています。Doomをその機械で動かすということは、その機械を完全に制御下に置いたという証左なのです。
LiDARとは
LiDARはLight Detection and Rangingの略で、レーザを使って距離を測るセンサの総称です。距離センサとしては他にもレーダ(電波)、ソナー(音波)、超音波などがありますが、LiDARは高速かつ非常に高解像度であることが特徴となっています。
自動運転車向けのLiDARは3次元的なスキャンが可能となっており、車の周囲をcm精度の3D点群として取得することができます。自動運転車はこのLiDARの点群を受け取り、周囲の歩行者や自動車の位置を把握(物体検出)したり、マップと照らし合わせて自身の位置を確認(自己位置推定)したりしています。
LiDARの測距方式はいくつかありますが、自動運転に使われているLiDARの主流はdToF(direct time of flight)方式です。このLiDARはLiDARから時間的に短い(数ns)パルス光を射出し、物体に反射して返ってくるまでの時間を計測して物体までの距離を算出します。
LiDARの脆弱性:LiDAR Spoofing Attack
T. Sato*, Y.Hayakawa*, R.Suzuki*, Y.Shiiki*, K.Yoshioka, Q. Chen, “LiDAR Spoofing Meets the New-Gen: Capability Improvements, Broken Assumptions, and New Attack Strategies”, Network and Distributed System Security Symposium (NDSS), 2024.
dToF方式の一部LiDARには既知の脆弱性として、LiDAR Spoofing Attackというものが存在します。簡単に言うとLiDARに対して外部からレーザをいい感じに照射することによってLiDARの測距が狂い、出力される点群を攻撃者に改ざんされてしまうというものです。上記研究により、Velodyne社のVLP-16というLiDARに対しては3次元の任意形状の偽装点群を注入できることが明らかとなっています。
VLP-16に対するInjection Attack詳細
自動運転車向けLiDARの市場を切り開いたのが、米Velodyne社です。VLP-16は同社のラインナップでも最も安価なLiDARの一つで、Velodyne社がOuster社に買収され、生産終了した今でも多くの自動運転システムで用いられています(主に小型の自動ロボットに多いです)。
VLP-16は16lineの3D LiDARです。縦に16個のレーザと受光素子を積み上げ、それらを360°回転させながら周囲を測距をすることで3D点群を得ています。垂直方向の視野角は32°、水平方向は360°です。
VLP-16は規則的なスキャンパターンで測距を行います。2.304usごとに1点の測距を行い、55.296usで同じ水平角の16点分を取り、次の水平角に移動することを繰り返しています。
攻撃者は各点の測距開始時間を予測し、それに合わせて外部からレーザを照射することで真の測距信号を上書き、任意の位置に点群を注入することができます。実際に人や車の形状を注入し、物体検知モデルなどを騙すことができることが実験によりわかっています。
任意の点群を注入できるということは、本当は存在しない位置に人の点群を急に出現させ、何もない場所で自動運転車の急ブレーキを誘うことなどができてしまうということです。非常に危険な攻撃であるとして防御策の開発が急がれています。
…
…任意の点群を注入できる…画面…Doom…
!!!
LiDARにSpoofing Attackを実行
→任意の点群を注入できる
→点を使って画面を構築
→DoomをLiDAR上でプレイできる!!!!
Doom on LiDAR戦略
DoomをLiDAR上で動かすためのシステム概要を上図に示します。
今回はDoomの画面をLiDARの点群として2次元的に表示することをゴールとします。画面の解像度は縦16×横152で、点群が存在する/存在しないの二値で表現します。
まずはPC上でDoomエンジンを動かし、ユーザ入力を受け付けるようにします。Doomエンジンは定期的に(10fpsなら1秒間に10回ずつ)画面の情報を出力します。Doomの出力する画面はカラー画像であるため、白黒の濃淡画像に変換してから、誤差拡散法により二値化します。誤差拡散法は濃淡を白黒の割合に置換するもので、二値ながら階調が存在するような見た目を実現できます。
この二値画像を波形変換器に入力し、LiDAR Spoofing Attackを用いてLiDAR上に画面が表示されるような波形を生成します。
次に波形をファンクション・ジェネレータ(FG)に送ります。FGは任意形状の波形を電気信号として出力できる装置で、生成された波形通りにレーザを動かす役割を持ちます。
正確な位置に点群を注入するため、FGはLiDARの射出した信号をトリガーとして攻撃を開始します。攻撃装置にはLiDARの信号を受け取るための受光装置が必要です。
とりあえずこのような装置が作れればLiDARの点群としてDoomの画面を写せそうです。
しかし実際に動かそうとすると、FGの要件が厳しいことが問題となりました。
リアルタイムでの波形生成
Agilent 81160A | Tektronix AFG31151 | Analog Discovery Pro | |
---|---|---|---|
波形メモリ長 | 131k | 16M | 32k |
最小サンプル長 | 1ns | 0.5ns | 256ns |
波形転送時間 | 2s | 1min(要USBメモリ) | 100ms |
Doomの画面をLiDARに写してプレイできるためには、長い時間・高い精度での任意波形が扱えることが必要です。視認できる大きさの範囲の点群を注入するには数msの長さの波形が必要であり、正しい位置に点群を注入するために1nsレベルでの時間的な正確性が要求されます。
また、エンジンの出力する画像をリアルタイムで描画する必要もあります。
前者に必要なのは波形メモリ長と最小サンプル長です。波形の精度は最小サンプル長で決定されます。FG出力の時間精度(立ち上がりのタイミング)などはどれもピコ秒単位なので心配ないのですが、今回攻撃対象となるVLP-16は2304ns間隔で測距を行っており、この周期に合わせられないとうまく攻撃が成功しません。例えばサンプル長が100nsだった場合、2300ns間隔の波形しか作れず、毎周期4nsずれて注入点群が湯がんでしまいます。よって2304nsの約数のサンプル長がとれればよいことになります。上に挙げたFGは全て2304nsの約数のサンプル長で動かすことができます。
また波形の長さはサンプル長×波形メモリ長で決まります。例えばサンプル長が1ns、メモリ長が100kだった場合、波形の長さは100usとなります。今回は大体5msくらい必要ですが、この条件も上のFGは全て満たしているようです。
後者に必要なのは波形の転送時間です。LiDARは基本的に5~20Hz程度で動作します。フレーム落ちしない条件は転送時間が200 ms以下であることとなります。この条件を満たせる手元のFGは、Analog Discovery Proのみでした。このFGは20万円程度と安価ですが、元々PCとの接続を前提としているため転送速度が速くなっています。他のFGは2s以上と、かなり遅いです。特にTektronixのFGはそもそも波形送信に一度USBメモリを介する必要があり、リアルタイムでの用途に用いることができません。
よってFGにはAnalog Discovery Proを採用しました。
試しに8bitのデジタル波形を100msごとに差し替えられるか試してみました。
できるようです。
しかし長い波形については送信上の問題が発生しました。Analog Discovery ProはPCからの波形の受信とその波形の出力を同時に行えないようなのです。長い波形だと送信に時間がかかり、100ms未満であっても波形を送信するタイミングと被ってしまって安定した出力ができません。結局LiDARを5Hzで駆動させることで解決しました。200ms間隔であればタイミングが合えば安定動作します。
実際に動かしてみた
材料が揃ったので実際に動かしてみます。
- PC側のプログラム: Python
- Doomエンジン: cydoomgeneric
- FGとの通信: dwfpy
- FG: Analog Discovery Pro ADP3450
- 攻撃装置: Sato et.al. NDSS’24が使用した装置と同
- LiDAR: VLP-16(5Hz駆動)
動きました。
おまけ
RickだってVLP-16で動いちゃうぜ
最後に
ソースコードは開示しません、危ないので
Share on X now! | Share on Facebook now! | Share on Linkedin now!