テキストファイルにもチェックサムを付けてください

Webで配布されるファイルにMD5が付いている。これはまっとうな話です。

ダウンロードしたファイルが壊れる可能性だけでなく,経路中で改竄される可能性だってあります。そりゃもちろんカイザンができるんならMD5もすりかえられているかもしれませんがね。

小さな装置の中にROMやEEPROM最近ではフラッシュROMが搭載されています。その中にはデータが格納されています。一部はマイコンの実行バイナリでしょうし,一部は設定データでしょう。FPGAのコンフィグレーションデータかもしれません。

どれも装置が動作するのに必要なもので,大抵は

1バイトでも壊れたら装置は動作できない

ということです。実際には1バイトくらいでは大きな問題はないかもしれませんが,それは運に左右されますのでギャンブルになります。技術者には許されません。(と私は思う。)

最近は装置の中にもファイルシステムがありシェルがあります。Webサーバ機能が組み込まれていてブラウザ設定値を変更したりできます。フラッシュROMの内容をアップデートすることができる機能も珍しくもなんともありません。

錯覚を起こしてはいけないんです。まるでホストPCと同じように操作できるからといって。稼動中に装置はスタンドアロンで動作しなければならないのですから。

ちょっとしたファイルが壊れただけで装置全体に影響を与える可能性もあります。もちろん開発中/立ち上げ期間中は,開発用PCなどをつないで気軽にファイルを差し替えたり書き換えたりできることは便利です。それは否定しません。

しかしですねぇ,いくらテキストファイルだからといって,チェックサムをつけないのはどうかと思うのです。

稼動中には設定ファイルなどを編集する手段をユーザに委ねる部分とそうでない部分に分離しておくべきです。そのためのWebインターフェースなのだと理解していました。

しかしながら,「これは民生用でないからユーザは設定ファイルであるテキストファイルを直接編集できないと困るだろう」と言うのです。

困ったものです。つじつまが合わない設定ファイルを放り込まれた時の挙動なんて保証できないのですよ。Webインターフェース経由で編集された場合にはチェックコードさえまともに実装されておれば,設定ファイルの一貫性は保証されます。そこを保証するところまでが製造者の責任です。

言い方は悪いですが,

  • 許可した操作をした時のみ動作を保証する
  • 許可していない操作については保証しない(保証していない操作であることを明示し同意操作を明示的におこなうことで操作自体は可能としても良い。例:両手操作)

これがPL法が施行されて以降の常識だと思っていました。この装置の場合,Webインフターフェース経由での設定値変更やアップデート操作までは確実に保証しますが,FTP経由やTELNETでつないで勝手に書き換えた場合には保証しません。それだけのことです。

ここを「保証できません」といわないで「保証しません」とはっきり言い切ることが求められます。

FTP/TELNET経由で設定を変更できるスキルのあるユーザならば余計な心配だと言う人がいます。しかし善意のユーザが常に善意に従って行動できるとは限らないのです。

あるユーザが善意でTELNET経由で設定を変更した
→別のユーザがその設定を原因としてトラブルに巻き込まれた
→法人としてのユーザの行動は「こんな設定方法が無条件に許可できていることが問題である」と主張。

いくらFTP/TELNET経由での設定変更を保証外だと謳ってたとしても,ユーザが勝手に設定ファイルの内容を書き換えてしまった上で「損害を被った」と主張したら困りますね。
#実際そんなセコイことを言うユーザはいないかもしれませんが,損害額によって話は変わってきます。

その防御策としても,チェックサムは有効です。Webインターフェース経由でファイルが編集された時にはチェックサムをファイル自身に含めてしまえば良いだけです。これでチェックサムの計算方法だけを隠蔽しておけば,「勝手に編集された」ことは簡単に検出できます。

最後は「設定ファイルが消えてしまう」問題です。ファイル自体が消されてしまう場合,チェックサムも消えます。なので誰が消したか分かりません。
しかしながら,ファイルシステム自体の異常でない限り,ファイルが「無い」ことは検出可能ですから工場出荷値のファイルを生成してしまえばよいだけです。

そうすれば少なくとも動作を保証できる設定値が呼び出され,Webインターフェースなどの標準的な機能も正しく動作することでしょう。

有無を言わさずに工場出荷値に戻す機能というのはなかなか役に立ちます。ファイルが中途半端に書き込まれている途中で電源遮断された場合などに対する対応でも有効です。

チェックサムがあれば,たった10行のコードでチェックできることを,チェックサムがなければ全設定値についての矛盾性をチェックするなどというばかげた機能を実装するハメに陥るのです。

これはどういうことかといえば,「売上伝票の束の中から何枚か抜けてしまったかもしれない」ということについてあ〜でもないこ〜でもないと伝票を1枚1枚ながめているのと同じことなのです。束にした時点で合計金額を*2回*計算して束の上に書き込んでおけば,改めて合計金額を計算するだけで「伝票が1枚以上抜け落ちた」ことが完全に客観的に検出できます。

この話題を妙な宗教戦争にしてはいけません。組み込みジャーナルファイルシステムなど夢・幻を語る前にチェックサムだけでできることがたくさんあります。CRCの計算だけなら十数行で書けます。メモリも全く消費しません。MD5ならもう少し重いですね。

ただし念を押しておきます。チェックサムやCRCを小ばかにする人たちに対しての警句です。
イーサのフレームにだって,CD-ROMのリードソロモンだって,携帯電話のパケット通信のパケットにだってチェックサムやCRC/ECCが入ってますからね。

20世紀中盤にオンラインシステムが世の中で活動を開始した頃から生み出された数々のコードにはチェックコードが余分についていましたね。アタリマエのことです。人間だけでなく計算機だって,通信経路だって誤り率がゼロということはありえないのです。

その根本問題を解決する手法と言うのはもう何十年も昔から,モノによってはもっと昔からあるんですから利用しないのはバカを見ますよ,ということです。