第14回TOPPERS活用アイデア・アプリケーション開発コンテスト 活用アイデア部門 への「並列プログラミング言語Elixir(エリクサー)からTOPPERSカーネル利用C・アセンブリコードを生成するサイドチャネル攻撃防御指向コンパイラ」の提案

第14回TOPPERS活用アイデア・アプリケーション開発コンテスト 活用アイデア部門 へ「並列プログラミング言語Elixir(エリクサー)からTOPPERSカーネル利用C・アセンブリコードを生成するサイドチャネル攻撃防御指向コンパイラ」という表題で応募しまして，銀賞を受賞しました．本記事では，既に公開されている応募内容について改めて共有し，ふりかえりたいと思います．

## 応募内容

### 部門

活用アイデア部門

### 作品のタイトル

並列プログラミング言語Elixir(エリクサー)からTOPPERSカーネル利用C・アセンブリコードを生成するサイドチャネル攻撃防御指向コンパイラ

### 作成者

山崎進

### 共同作業者

山崎進研究室

### 作品の対象者

- セキュア指向のあるTOPPERSカーネルのアプリケーション開発者
- ウェブやAIのエコシステムをTOPPERSカーネルに取り込みたい会員

### 使用する開発成果物

- HRMP3カーネル

### 目的・狙い

TOPPERSカーネルプログラミングを容易にするため，平易な並列プログラミング言語であるElixirでTOPPERSカーネルを利用するC・アセンブリコードを生成するようなコンパイラを研究・開発する．サイドチャネル攻撃から防御するようなコード生成方針を採用する．セキュア指向なのでHRMP3カーネルを利用する．

### アイデア／アプリケーションの概要

山崎進研究室で培ってきたElixirのコード生成・最適化技術を踏まえ，ElixirのコードからHRMP3カーネルを利用するC・アセンブリコードを生成する．アセンブリコードはHRMP3カーネルのターゲットであるARM Cortex-A9とする．暗号起因の処理を特定しサイドチャネル攻撃から防御するようにコード生成する．

![ElixirTOPPERS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55223/2caefdff-c008-c18a-d5d0-9e583f2ddd09.png)

### 背景1: 平易な並列プログラミング言語Elixir(エリクサー)

提案者が研究を進めている並列プログラミング言語Elixir(エリクサー)は，平易な並列処理と例外処理の記述を特長としており，IoTフレームワークNerves(ナーヴス)でも用いられている他，ウェブフレームワークPhoenix(フェニックス)，AIフレームワーク Nx(エヌエックス)／Axon(アクソン)／Bumblebee(バンブルビー)といった強力なOSSを持っています．

たとえばElixirでモンテカルロ法を用いて円周率を求める逐次プログラムは次のようになります[(参考文献: GeekMasahiro: Elixir Flow で Ryzen の全コアぶん回したら10倍速かった, 2022)](https://qiita.com/GeekMasahiro/items/009fc414ca113ce391d6)．

```elixir
1..10_000_000
|> Enum.map(fn _ -> {:rand.uniform(), :rand.uniform()} end)
|> Enum.map(fn {x, y} -> x * x + y * y < 1 end)
|> Enum.count(fn bool -> bool end)
|> Kernel./(10_000_000)
|> Kernel.*(4)
```

これを並列化したプログラムは，次のように，逐次プログラムとほぼ似たようなコードになります．

```elixir
1..10_000_000
|> Flow.from_enumerable()
|> Flow.map(fn _ -> {:rand.uniform(), :rand.uniform()} end)
|> Flow.map(fn {x, y} -> x * x + y * y < 1 end)
|> Enum.count(fn bool -> bool end)
|> Kernel./(10_000_000)
|> Kernel.*(4)
```

なお，Apple M3 Max の MacBook Pro で実行したところ，並列版は逐次版より12.9倍高速に実行できました．

このような平易に並列プログラミングできるElixirで，TOPPERSカーネルを利用するアプリケーションが記述できると，有用なのではないかと考えています．

この観点では，利用するTOPPERSカーネルの候補として，マルチプロセッサ向けであるFMP3カーネルもしくはHRMP3カーネルが妥当そうです．

### 背景2: サイドチャネル攻撃に対する体系的な防御の研究の必要性

TOPPERSカンファレンス2024特別講演「組込みシステムへのサイドチャネル攻撃とその対策」にもあったように，組込みシステムアプリケーションもセキュリティ脅威に晒されています．質疑において，講演講師の原先生のご専門のサイドチャネル攻撃について，コンパイラのコード生成・最適化を含めて体系的に対策を取る必要があるにもかかわらず，世界的な研究水準でもアセンブリコードレベルのサイドチャネル攻撃対策の検討にとどまっているのが現状であるとの回答がありました．そこで，こうした研究は，意義と新規性があるものと考えられます．

こうした研究をGCCやClangなど，世界的に普及したCコンパイラで行えると良いとは思います．しかし実現可能性という観点に立つと，これらのコンパイラはコードベースもコミュニティも巨大であり，一朝一夕に動かすことができません．

一方で，提案者はElixirのコード生成・最適化の研究にすでに従事しており，国内外のコミュニティの支援も受けています．サイドチャネル攻撃からの防御の研究においても，Elixirのコード生成・最適化であれば，即座に始められる状況にあります．

TOPPERSカーネルにおいても，保護を重視するHRP3カーネルとHRMP3カーネルを利用するアプリケーションにおいて，サイドチャネル攻撃から防御するようなアプリケーションコードを記述することで，組込みソフトウェア全体のセキュリティ水準を向上させることができると考えられます．

背景1,2を合わせて考えると，マルチプロセッサ向けであり，かつ保護機能を備えるHRMP3カーネルを対象に研究するのが良さそうに考えています．

### 背景3: Elixirを実行する方式について

Elixir を実行するための従来方式は，母体となっているErlang(アーラン)の処理系を移植し， BEAM(ビーム)あるいはErlang VM(アーラン・ヴイエム)と呼ばれる仮想機械あるいはJITによって，実行する方式が一般的です．この方式では，Erlangの長年培ってきたコードベースを再利用することができます．

しかし，背景2を踏まえると，コード生成・最適化を自分の手で細部まで制御する必要があります．今までの研究を踏まえると，その観点で取り組むのであれば，一から処理系を構築したほうが良いと考えています．

一方，提案者は，現時点までに，Elixirのコードから直にネイティブコードを生成する技術の研究開発を進めてきています．この技術を利用して，TOPPERSカーネルを利用するC／アセンブリコードを生成するようなコンパイラを研究開発することができます．この方式ならば，背景2を踏まえた研究を踏まえることができます．

### 目的

TOPPERSカーネルプログラミングを容易にするため，平易な並列プログラミング言語であるElixirでTOPPERSカーネルを利用するC・アセンブリコードを生成するようなコンパイラを研究・開発します．その際に，サイドチャネル攻撃から防御するようなコード生成方針を採用します．マルチコアプロセッサかつセキュア指向にすることからHRMP3カーネルを利用します．

### 市場性

TOPPERSプロジェクトとして，TOPPERSカーネルの利用者を拡大することが強く望まれます．Elixirの平易な並列プログラミングの記法を導入することで，その一助になることが期待できます．

また，ElixirのもつウェブやAI，IoTのOSSをTOPPERSのエコシステムに取り込める可能性があります．中でもElixirのAI関連OSSはPythonベースのものと互換性があり，StableDiffusionやLLMを動かすこともできます．ウェブやAIによりTOPPERSの新しい市場を開拓できる可能性があります．

本提案により，サイドチャネル攻撃に耐性のあるアプリケーションをElixirで平易に記述できるようになるのであれば，TOPPERSのセキュアRTOSとしての可能性を広げることができ，新たな市場を得られる可能性があります．

### 研究計画

1. TOPPERS/HRMP3カーネルのターゲットであるZybo Z7-10を入手済なので，Zybo Z7-10でTOPPERS/HRMP3カーネルを動作させる
2. TOPPERS第3世代カーネル(ITRON系)統合仕様書に基づき，Elixirからのコード生成仕様について検討を進める．
    1. Elixirの`send`/`receive`にはデータキューもしくはメッセージバッファを用いて実装する
    2. 固定長メモリプールとメモリオブジェクト管理機能を用いてメモリ管理を行う
    3. 時間管理機能とアラーム通知を用いて `:timer` モジュールと `:calendar` モジュールを実装する
    4. 時間パーティショニング機能を用いて公平なスケジューリングを実現するよう努める
    5. `:crypto`, `:ssh`, `:ssl`などの暗号を用いるモジュールを実装する際には，拡張サービスコール機能とメモリオブジェクト機能を用い，セキュアな実装をするように努める
3. Elixirのサブセットとなる言語仕様を定め，2の方針に基づき具体的なコード生成方針を定める
4. Elixirのバイトコードを格納するBEAMファイル等からプログラムコードを読み込み，3に基づいてコード変換器を実装する
5. 都度，生成されたコードの量や質に関する評価を実施する
6. 都度，得られたコードに基づいてサイドチャネル攻撃の耐性等のセキュリティ評価を実施する
7. 徐々に言語仕様の範囲を拡大していき，既存OSSを活用できるように整備する
8. 既存ツールチェーンを適切に運用するような，利活用しやすいツールチェーンとして整備していく

### 研究資金

2024年度中の技術的検討に必要なZybo Z7-10は入手済なので，研究計画の1〜3までは，追加の研究資金無しに進められます．2024年度中に研究計画の1〜3を地道に進めておき，2025年度から研究計画を立案し，研究計画の4以降で必要な研究資金の獲得を目指します．

現在，研究資金の公募情報を収集しているところです．科研費については，現在の基盤Cが当面完了しないので，応募できる種目がありません．コード生成におけるサイドチャネル攻撃の研究領域として申請するのが妥当そうですが，もう少し深掘りして焦点を絞らないと，応募するのに妥当な研究資金の方向性が見えてこないと考えております．

TOPPERSプロジェクト会員から共同研究費や奨学寄付金を募るというのでも，現在のTOPPERSプロジェクト会員のニーズを踏まえないと，妥当な研究テーマが見えてこない上に，募集もうまくいかないものと思われます．本提案によりTOPPERS活用アイデア・アプリケーション開発コンテスト2024に応募することで，ニーズ収集を図りたいという意図があります．

#### 追記

ここで論じているサイドチャネル攻撃の対策は，マスキングと呼ばれる手法で，下図のように条件分岐のどちらの分岐を辿っても，消費電力と使用する演算ユニットなどが変化しないようにコード生成することで，観測しても統計的に有意な差が出ないようにする手法です．

![masking.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55223/7a207c40-f1a5-1b10-fbff-ed22b2e05a99.png)

宇宙戦略基金「衛星サプライチェーン構築のための衛星部品・コンポーネントの開発・実証」に応募した際に，本提案を盛り込もうとしたのですが，予算不足で叶いませんでした．

また，研究目的のCコンパイラを構築して，同様にサイドチャネル攻撃耐性に関する研究を行おうと考えています．詳しくは後日紹介します．