Wi-Fiパケットを用いた研究室在室チェックシステム『CyRoom』を作ってみた

前回の投稿から約7か月ぶりM1になりましたkidaです.
今回は私が2024年度春学期に作成した研究室在室チェックシステム(以下,CyRoom)について備忘録としてまとめていきたいと思います.

CyRoom運用の様子1
CyRoom運用の様子2

概要

CySec研はすべてのゼミがオンラインでも参加可能なハイブリッド形式を採用しており,コアタイムなどもないので特定のラボメンバーをアポなしに捕まえるのは至難の技です.
また,研究室のPCをリモート接続で利用しており調子が悪くその再起動を研究室でお願いする場合にも,まず研究室に誰が居るのかを確認することから始まり手間がかかります.

そこで研究室に誰がいるのかをリアルタイムで把握できると非常に嬉しい,ということでCyRoomのプロジェクトが立ち上がりました.
またCyRoomの要件として利用者(被検知者)に負担を強いない(普段の行動に+αの手間が加わらない)ことを目標としました.

Wi-Fiパケット

CyRoomを作成する上でWi-Fiパケットを用いることにしたのですが,以下の仮定のもとでシステムを実装しました.

  • 利用者はスマートフォンを持ち歩いており,利用者とスマートフォンの位置は常に同じである.(端末の確認が利用者の在室と同義)

システムの運用としてはWi-Fiパケットをキャプチャしてそこから利用者のスマートフォンがないかを確認していくのですが,利用者のスマートフォンの見分けにはMACアドレスを利用します.
「MACアドレスとは何?」という説明はここで詳しくはしませんが,簡単に言うとMACアドレスとは端末1つ1つにユニークに(重複なく)与えられているIDみたいなものだと今回の記事では認識しておいてもらえばいいです.(厳密には違うので詳しくは調べてみてください)
事前に利用者スマートフォンのMACアドレスを控えておき,研究室内で送信元が利用者のMACアドレスであるWi-Fiパケットが存在すれば「利用者が在室している」として検知する簡単なシステムとしたいのですが,実はこれだけではうまくいきません.

MACアドレスは端末1つ1つに割り振られるユニークな値なのですが,Wi-Fiパケットなど簡単に他者から見られるものにユニークなMACアドレスが含まれていると利用者のプライバシー漏洩につながってしまいます.ということで実際のスマートフォンが発信するWi-Fiパケットにはその端末の本物のMACアドレスはほとんど含まれていません.じゃあどんなものが含まれているかというと,代わりに使い捨てのランダムなMACアドレスがWi-Fiパケットに含まれています.つまり利用者スマートフォンの本物のMACアドレスを把握しても端末の在室把握には役に立ちません.(端末側で意図的に本物のMACアドレスが使用されるように設定する場合は除く)
また利用者に負担を強いないというのを要件としていたので,利用者スマートフォンのプライバシー保護機能を無効にすることはしたくありませんでした.

ではどうすればいいのでしょうか?実はスマートフォンのWi-Fi設定画面を確認すると接続するアクセスポイントごとに異なるランダムなMACアドレスが割り当てられていることがわかります.

iPhoneの設定画面で確認できるAPごとに割り当てられる使い捨てのMACアドレス(プライベートWi-Fiアドレス)

細かい割り当てられ方などのMACアドレスのランダム化に関するルールはスマートフォンのOSやそのバージョンにより異なるのですが,大まかに以下の条件を満たせばWi-Fiパケットに含まれるMACアドレスを用いて端末の在室把握をできそうだと考えました.

  • 利用者スマートフォンのWi-Fiは常にONであり,研究室に来た際には研究室のアクセスポイントに自動で接続する.

この条件であれば利用者スマートフォンの研究室アクセスポイント用のMACアドレスを事前に把握しておくことで端末の在室把握ができます.

いざ作成

上記で事前に確認した条件をもとにRaspberry Pi + Google Apps Script みたいな組み合わせでシステムを作成していきます.

端末Raspberry Pi 3 Model A+
OSRasberry Pi OS Lite 32bit
無線LANアダプタTP-Link Archer T3U Plus
Raspberry Pi 環境

Raspberry Pi上でAircrack-ngを使用してパケットキャプチャを行います.この際無線LANアダプタはモニターモードに変更できるチップセットのものを選びましょう.内蔵Wi-Fiでもできないことはなさそうですが,壊れた時に取り返しがつかないためパケットキャプチャには外付けの無線LANアダプタを使用することをおすすめします.
取得した.capファイルを皆さんご存じWiresharkでフィルタリングして.csvファイルで出力します.厳密にはWiresharkではなく,CUIで操作ができるtsharkを使用しました.
できた.csvファイルをPythonでGoogle Driveにアップロード,GASでよしなにスプレッドシートに表示して定期的にSlackに送信するようにすれば完成です.

運用

弊研の学生に協力してもらい2024年6月ごろから実際に運用を開始しました.
細かいトラブルはあったもののある程度の精度で在室を検知できることが確認できました.
夏休み以降は半自動だったシステムを自動化し,ほっといても常にパケットキャプチャして検知するようになっています.

課題

定期的にパケットキャプチャを実行しなければならないのですが,今回はcronを使わずにWindowsからTera Termを使ってRaspberry PiにSSHで接続し,Tera TermマクロをWindowsのタスクスケジューラを使うことで定期実行を実現しています.シンプルにcronでできたほうがスマートなのですが,Aircrack-ngの実行がcron経由でうまくいかずこのような方法になってしまっています.おそらく権限まわりなどを適切に設定してやればうまくできるとは思うのですが2024年11月現在はほったらかしになっています.

また,夏休み以降自動化したのはいいのですがたまにラズパイが落ちます.しばらくすれば再起動してCyRoomも有効になるのですが落ちている間は検知漏れが発生します.そもそも起動していても精度がめちゃめちゃいいわけではない(滞在して数十分後でようやく検知の場合もある)のですが,たまに落ちるのをほっとくのはまずいので深夜にラズパイを自動で再起動するようにして改善するかどうか様子をみる予定です.
入口に人感センサー(もしくはドアの開閉を検知するセンサー)を設置しておき,人が通ったときのみパケットキャプチャを行うようにしても面白いかもしれません.

おわりに

ということでWi-Fiパケットを利用した在室チェックシステムCyRoomのざっくりとした説明でした.
事前に利用者の端末が研究室のAPに使用するMACアドレスを把握するのが手間ですが,思ったより簡単に在室状況を可視化する事ができました.みなさんも自身の研究テーマを活かして簡単な開発っぽいことをしてみてはいかがでしょうか.本業である研究をほっといてこういうことをすると背徳感まで味わえます.

24h365dで頑張ってくれているラズパイ君

ちなみに今回のブログに関連する私が関わっている研究は以下になります.
木田伍, 上原哲太郎「Wi-FiのProbe Requestによるプライバシー情報漏洩の検証」研究報告インターネットと運用技術(IOT), 2024-IOT-64(30),1-8, (2024年3月)

ではまたどこかでお会いしましょう.

参考にしたサイト

PythonでGoogle Drive APIを使う
https://zenn.dev/spacegeek/articles/45270323b1d2bc

SSH接続・CUI操作のLinux(Debian)にgoogle-drive-ocamlfuseをつかってGoogleDriveをマウントする - Pirika Developers Blog

SSH接続・CUI操作のLinux(Debian)にgoogle-drive-ocamlfuseをつかってGoogleDriveをマウントする方法

csvをGoogle スプレッドシートに定期的に反映させる | Tips Note by TAM

TAM のテクニカルチームがお届けする WEB技術ブログ!

タスクスケジューラで無期限に繰り返しを行うタスクを作成する際の注意点
https://jpwinsup.github.io/blog/2023/02/07/UserInterfaceAndApps/Repeat-task-indefinitely-issues

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です