Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Linuxの改造とパッチ

morimolymoly
September 26, 2021
2.7k

 Linuxの改造とパッチ

若手の会2021で登壇した際にLinuxにJIS版MagicKeyboardを対応させるパッチ投稿についてはなしました.

morimolymoly

September 26, 2021
Tweet

Transcript

  1. WHO AM I ? • 森 瑞穂(@morimolymoly) • 電気通信大学永遠のM2 •

    趣味: 音楽/VALORANT/セキュリティ関連 • 研究: VMMを用いた高速なバイナリトレーサー • 未踏スパクリ@2019 • セキュリティの会社でセキュリティの…エンジニア?やってるんですけど! • 最近だと…… ◦ Smishingで落ちてきた検体を解析したり ◦ フェスというフェスがなくなったり ◦ 来年からはセキュリティエンジニア見習い予定 (卒業できれば)
  2. 初期調査 • xevコマンドでキーが認識されているか確認する ◦ 認識されない ◦ keycode: 97(ろ), 132(|)、131(英数)、130(かな) が認識されるべき

    • これはカーネルの問題では……?🤔🤔🤔 • 一通りユーザランドで調査できることはやった上でカーネルランドへ潜りましょ う!!!!! ◦ 今回は完全にカーネルなのでカーネルを読んでいきます
  3. とりあえず関連してそうなパッチを探す • Linux kernelのような巨大なソフトウェアをいじるときはpatchを探して大まかな修正 箇所を見積もるのが速い気がする • “apple magic keyboard patch”でググるとでてくる

    ◦ http://lkml.iu.edu/hypermail/linux/kernel/1808.2/04900.html • drivers/hid/hid_apple.c ◦ HIDサブシステムのなかの Appleのファイル • hid-core.cとhid_apple.cあたりに問題がありそう?
  4. HIDサブシステムってなに??? • Human Interface Deviceとのことでキーボードやマウスなどを示すもの ◦ USBからBluetoothまで拡張されていった経緯があるらしい • まずデバイスがReport Descriptorをカーネルに送る

    • ユーザがデバイスを操作するとレポートがカーネルに送られる • カーネルはReport Descriptorを使ってレポートを読み、イベントを処理する • この一連のシステムのこと、らしい • ざっくりとした理解!
  5. 原因を特定する2 • 先程の通り、hid_core.cを起点にイベントなどが発せられるようだ • ...-> hid_report_raw_event -> hid_input_fieldと関数を下っていく • するとhid_input_fieldからhid_process_eventが呼ばれ、hid_appleにイベントをフィ

    ルタした上で渡していることがわかった。 ◦ その間、hid_appleでやったprintk debugを同じ用に入れて入力をトレース ◦ 結果、特定の入力がドロップされていることを確認 • 原因が特定できた😎😎😎
  6. hid-coreのハック • hid_input_fieldから特定の条件分岐を経て、hid_appleにイベントが通知される -> ここを通るようなパッチを作れば良さそう! • logical_maximumとmax_usageってのが絡んでいるらしい ◦ なにこれ? •

    理解はしないでlogical_maximumとmax_usageに大きな値を入れたらうごいた! ◦ hid_add_fieldなるところでこれらが設定されていた ◦ なにをしたのか理解しなければ ……
  7. Report Descriptorの調査 • HIDデバイスはホストとレポートという形でやり取りする • Report DescriptorとはHIDデバイスからホストへレポートを送るときの取り決めをす るもの ◦ logical_maximumやmax_usageはそれぞれ、レポート中の値の上限と使用する値の上限を意味す

    る • 先程の汚いハックで解決したのはここのディスクリプタの値が間違って?いたから だった • で、ここらへんで先人のかたが着手している記事を見つける ◦ https://qiita.com/uskf/items/1170728d1c5c83432c6e ◦ 数時間返して……😇😇😇
  8. パッチ投稿 • はぁ…はぁ…あとはパッチを送るだけだ……(ここまで徹夜) • Linux nextやmainlineのカーネルにパッチを適応させる • あとはgit commit -s(Signed-off-by付き)でコミット

    • git format-patchでパッチを生成 • get_maintainer.plスクリプトで誰にメールを送るかを確認(パッチを食わせるとわか る)(linux-inputなどが出てきたが一応送るべきかも?) • git send-emailでメンテナの方々、メーリスを含むようにメールを送る • おわり!
  9. 全然反応来ないけど自分は使えてるので満足です! • 結果、全然反応が来ません!! ◦ おそらくJIS版のMagic Keyboardは優先度が低いのだろう ◦ でも使えないのはイケてないよね • 独立してカーネルドライバをリリースしました

    ◦ hid-appleに更新がアレば追従しようと思うので LinuxでJIS版Magic Keyboardが使いたい方はぜひ 利用してみてください ◦ https://github.com/morimolymoly/hid-apple • 僕は毎日使っています。JIS版Magic Keyboardサイコー!