自動車ってどうやってハッキングするんですか? @IoTSecJP #2 by @_tokina23
- 5. ❖ (将来) ITS (Intelligent Transport System)、など
❖ ナビ(インフォテインメント)
❖ 携帯回線, WiFi, Bluetooth
❖ USB端子
❖ CD/DVD, Audio,
❖ OBDポート(CAN)
❖ キーフォブ
❖ 各種物理センサ
❖ 各コンピュータ(ECU)
❖ ECU鍵の取り出し(サイドチャネル攻撃, ファームウェアダンピング,,)
幅広い自動車セキュリティ
影響・範囲
大
小
- 8. CAN (Controller Area Network)
❖ 現在自動車で最も利用されているネットワークプロトコル
❖ 主に自動車の制御系に利用される
❖ 通信はブロードキャストのみ
❖ 通信速度(baudrate)は500kpbsと低速
❖ Frameについて
❖ dominant (0)とrecessive (1)ビットのみで構成 (通常16進数で表記)
❖ 宛先アドレスのみ(CAN ID)をもつ (最大11bit; ~0x7FF)
❖ データ長 (DLC) 4bit、データ部 8byte
❖ CANバスでは0が優先される
❖ ➔DoS攻撃に弱い!(バスがすぐにいっぱいになる
)
❖ ➔送信元アドレスがないのでなりすましを判断不可
!
❖ ➔セキュリティ機能を付加しづらい!!
- 12. ❖ Q. え・・・なんでそんなのがまだ利用されているんですか?
❖ A. 移行コストが莫大にかかるからです
各種サプライヤーさんもいい顔しないし・・・
❖ Q. じゃあどうすればいいですか?
❖ A. とりあえずの解決策として、ゲートウェイの導入が進んでいます。
さらに次のステップとしてMAC認証が検討されています。
理想としては、Ethernetへの移行などがあげられるでしょう。
- 28. ❖ 井上博之 先生 @広島市立大学
❖ CANを始め、自動車セキュリティに関する研究などを行っている
https://www.nikkan.co.jp/articles/view/00396292
2016/8/16
車載器
小型Linuxマシン
Arduino
- 32. ❖ ミニハックでやること
❖ MAC Book Airから自動車を流れるCANメッセージを覗く!!しかもWirelessに!
❖ 必要なもの
❖ 自動車 (そこら辺のディーラーへGO) ※OBDポートアリに限る
❖ Mac Book Air (Windows, LinuxでもOK)
❖ OBDドングル (Amazonとかでポチりましょう)※今回はBluetoothドングル
❖ ATコマンドについての知識 (ググりましょう)
❖ (おまけ)Pythonについての知識 (勉強しましょう)
- 35. ❖ 自動車にOBDドングルを接続
❖ ハンドルの下とかにあります(たぶん)
❖ 自動車のエンジンを起動 (電源供給)
❖ MACからOBDドングルとペアリング
❖ OBD端子に接続するだけで電源ON
❖ うまくいかないときは何度か試しましょう
❖ Terminalから/dev配下にOBDが見えているか確認
❖ 今回はtty.OBDII-Portとして見えました
Bluetooth MAC Address: AA:BB:CC:11:22:33
PIN: 1234 (固定)
- 37. ❖ ATコマンド
❖ ATZ ➔ 設定初期化
❖ ATL1 ➔ 改行コードを変更
❖ ATI ➔ コントローラのバージョン情報を返す
❖ ATH1 ➔ メッセージ全体を表示
❖ ATSPA6 ➔ CAN使用、11bitアドレス、500kbpsにバージョン変更
❖ ATRV ➔ 車両の電源電圧を返す
❖ ATMA ➔ 受信メッセージのダンプ
❖ ATDP ➔ 自動車が対応しているコマンド数を返す
その他コマンド一覧:
https://www.sparkfun.com/datasheets/Widgets/ELM327_AT_Commands.pdf
- 39. ❖ Pythonで連続してダンプするプログラムを作成
import serial
import time
con = serial.Serial(‘/dev/tty.OBDII-Port’, 115200, timeout=10)
con.write("ATZ¥r")
time.sleep(1.0)
con.write("ATL1¥r")
con.write("ATH1¥r")
con.write("ATSPA6¥r")
time.sleep(0.1)
print "Waiting for CAN message ..."
con.write("ATMA¥r")
while 1:
str = con.readline().rstrip()
print str
if str == "BUFFER FULL":
con.write("ATMA¥r")
continue
これで繰り返しダンプできる!!
- 40. ❖ (おまけ)PythonとOBDプロトコルで回転数と速度を取得してみる
❖ pip install obd をしておくこと
import obd
import time
import inspect
print 'Connecting to ...', obd.scan_serial()
connection = obd.OBD(baudrate=115200) # auto-connects to USB or RF port
print connection.port_name(), 'connected.'
while True:
response = connection.query(obd.commands.RPM)
print response.value
response = connection.query(obd.commands.SPEED)
print response.value
time.sleep(2.0)
CAN IDが不明でも情報取得ができる!