NICTがIoT機器に無差別侵入し調査へ・・・

総務省 IoT機器に無差別侵入し調査へ 前例ない調査に懸念も」の記事を受けてIT業界にまたも激震が広がってる。「通信のブロック」 「coinhive検挙」 「ダウンロード違法化」と立て続けで、流石に辟易してくる。

あわてて条文など内容を確認したが、下記のようなことらしい。

法改正によってNICTを不正アクセス防止法の規制対象外にした。
NICTは第三者のID/PASSWORDを使って機器にログインする事、機器にログインした後その機器を操作すること、その機器を踏み台にしてさらに別の機器へのログインを試みることが出来るようにした。
電気通信事業者にはNICTから通達のあったIPアドレスを使用しているユーザーに対して警告する義務が追加された。

この法改正により、NICTは日本国内に設置されているインターネット上から接続出来る脆弱なパスワードが設定されている機器を調査する業務を行い、脆弱な機器を使っているユーザーには通信事業者を通じて連絡が来ると言うことのようだ。

法文を読むに、ブルートフォースなどにより機器にログインした後、その端末を操作して踏み台にし、LAN内の機器にまでログインして操作ことを許可しているように読み取れる。単にパスワードの調査だけではなく、より踏み込んだ調査が行われる可能性もあるようだ。

すでに調査はスタートしていて、11/14までにポートスキャンによる事前調査を終えている。スキャン対象となっているのはポート22(SSH)、ポート23(TELNET)、ポート80(HTTP)で接続時に表示されるバナー情報から機器情報を得ている。

この事前調査に使用したとされるIPアドレスはWhoISを見る限りNICT管理下のものなので、きちんとNICT管理下で行われているようだ。どこぞの業者に委託してて委託先業者から漏洩・・・と行ったことはひとまず心配しなくても大丈夫だろう。

ただ今回計画されている調査の有効性には疑問を感じる。

日本国内のインターネット接続環境は、BBルーターを介した接続になっていることが多く、ルーターの設定を意図的に変更してポートフォワードの設定をしない限り、設置した機器がインターネットから直接アクセス可能になる事は殆ど無い。かといってインターネットから直接アクセス出来ないなら、標準のパスワードのままでも安心出来るのかというと、危険である事は変わらない。

例えば僕ならLAN内のIoT機器にログインを試みるアプリケーションをメールに添付して送り込むといったことを普通に思いつく。この手のアプリケーションはウィルス対策ソフトに検出される事もまずない。多層防御がきっちりなされていない場合、 狙い通りにLAN内のIoT機器に侵入して設定を変更してしまうだろう。

今回計画されている調査は、インターネットから直接接続は出来ないが、LAN内に存在する脆弱なパスワードが設定されたIoT機器に対しては有効ではない。インターネットからは接続出来ないが脆弱なパスワードが設定されたIoT機器は、今回の調査対象よりも桁違いに多いはずだ。

ここまで強硬な手段を執る前に、公共性の高い事業者や規模の大きい事業者に対して、脆弱性診断を受けることを義務づけるとか、より有効な方法があっただろう。
なぜこんな方法にいきついたのか、大きな疑問を感じる。

なにはともあれ、アクティブサイバーディフェンスを法制化して国主導で行うというのは、他の先進国でも類例が無いのではなかろうか?国が個人の端末に勝手にログインする事の善し悪しを議論したり、国民のコンセンサスを得る前に、 良くも悪くも 世界最先端をいくセキュリティ体制が走りはじめてしまった事になる。

参考URL:
IT Research Art:NICT法改正と不正アクセス禁止法
NICT:日本国内でインターネットに接続されたIoT機器等に関する事前調査の実施について
総務省:国会提出法案

僕の経験した最悪の糞コードの話

ツイッターで久しぶりに糞コードの話を見かけたので、僕の知る最悪の糞コードの話を書いておこうと思う。

そのコードはGeneric Programmingによって実装されていました。クラスはきちんと整理されており、テンプレートを最大限に活用したコードは必要最小限の記述となっています。整然とひとつの思想によって実装された素晴らしいコードでした。いくつかの致命的な問題を除いては・・・

一つ目の致命的な問題は、このプロダクトがWindows向けであり、開発環境にVisual C++を使用していたことです。当時のVC++コンパイラにはバグがありました。複雑なテンプレートを定義すると、コンパイラがジェネラルプロテクションエラーを起こして終了してしまうのです。

知っていれば回避可能な、実用上は問題ないバグをBy Design(仕様)と称していた時代の話です。コンパイラのバグが近日中に修正される可能性はありません。この問題を根本的に解決するには、プログラムの根幹を構成しているGeneric Programmingを、互換性を維持し挙動を変えることなく取り除く・・・・って、ほぼリメイクですヤン!

実際には既にリリースしてしまっているので互換性維持は絶対、修正や機能追加は待ったなし、そんな大規模修正できません。影響の少なさそなところからGeneric Programmingを取り除き、VC++が落ちない程度までテンプレートの使用量を減らしては、修正をするって作業に明け暮れたのでした。

一つ目の・・・と書いたからには二つ目以降もあるわけで、DLLの引数としてクラスを何の考えもなく受け渡してる。それもDLL側で確保して呼び出し元で解放させたり。C++はコードや変数がどのようにメモリ上に展開されるかは仕様として定められていません。したがってクラスを引数として受け渡そうとするなら、全てのモジュールを同じコンパイラ、同じヘッダファイル、同じコンパイルオプションでビルドするのが必須です。ちょっと直すだけでも全モジュールをビルドし直して置き換えないと動作を保証できないという困難さ。

このコードを書いたエンジニア、どうやらJavaのスペシャリストであったようです。JavaのプログラマとしてOOな設計やコーディング技法には精通しており、その技をしっかりと使いこなしていました。でもC++固有の言語仕様には非常に疎く、おそらくはほぼ初心者。newしてもdeleteを呼んでいる場所が全くない。C++の言語仕様上の地雷をことごとく踏み抜いてく、そんなクソースでした。

Windows7でWindowsUpdateの再起動中に15%程度でとまってしまう

Windows 7 Professional (x64)の環境において、Windows Updateで繰り返しエラーが発生。OSの再起動中に毎回15%程度のところでエラーが発生して、巻き戻されてしまいます。久しぶりにC:\Windows\Logs\CBS\CBS.LOGの出番です。

2019-01-22 10:17:51, Info                  CBS    Waiting for poqexec.exe to complete...
2019-01-22 10:17:56, Info                  CBS    Waiting for poqexec.exe to complete...
2019-01-22 10:18:01, Info                  CBS    Waiting for poqexec.exe to complete...
2019-01-22 10:18:10, Info                  CBS    SQM: Reporting poqexec status with status: 0xc0000043, failed file: conhost.exe, interfering process: tmbmsrv.exe,conhost.exe,conhost.exe, context: Startup, first merged sequence: 1613
2019-01-22 10:18:10, Info                  CBS    SQM: Upload requested for report: PoqexecStatus, session id: 142861, sample type: Standard
2019-01-22 10:18:10, Info                  CBS    SQM: Ignoring upload request because the sample type is not enabled: Standard
2019-01-22 10:18:10, Info                  CBS    Failure in poqexec.exe while processing updates. [HRESULT = 0x80070020 - ERROR_SHARING_VIOLATION]
2019-01-22 10:18:12, Info                  CBS    Set the CCP impactful-commit disabling value
2019-01-22 10:18:12, Error                 CBS    Startup: Failed while processing critical primitive operations queue. [HRESULT = 0x80070020 - ERROR_SHARING_VIOLATION]
2019-01-22 10:18:12, Info                  CBS    Setting ExecuteState key to: CbsExecuteStateResolvePending | CbsExecuteStateFlagRollback
2019-01-22 10:18:12, Info                  CBS    Progress: UI message updated. Operation type: Update. Stage: 1 out of 1. Rollback.
2019-01-22 10:18:12, Info                  CBS    Startup: Processing advanced operation queue, startupPhase: 0
2019-01-22 10:18:12, Info                  CSI    00000006 IAdvancedInstallerAwareStore_ResolvePendingTransactions (call 1) (flags = 0000000a, progress = NULL, phase = 0, pdwDisposition = @0x1e0f9e0
2019-01-22 10:18:12, Info                  CBS    Startup: Changing logon timeout to a static timeout: 10800000
2019-01-22 10:18:13, Error                 CSI    00000007 (F) Error: ResolvePendingTransactions called after poqexec failure (call 1)
  Status = STATUS_SHARING_VIOLATION, Operation = DeleteFile, DiagString = [l:70{35}]"\??\C:\windows\System32\conhost.exe"
[gle=0x80004005]
2019-01-22 10:18:59, Error                 CBS    Startup: Primitive operations failed, startupPhase: 0.  The transaction will be cancelled. [HRESULT = 0x80004005 - E_FAIL]
2019-01-22 10:18:59, Info                  CBS    Setting ExecuteState key to: CbsExecuteStateInitiateRollback | CbsExecuteStateFlagPrimitivesFailed
2019-01-22 10:18:59, Info                  CSI    00000008 Creating NT transaction (seq 1), objectname [6]"(null)"
2019-01-22 10:18:59, Info                  CSI    00000009 Created NT transaction (seq 1) result 0x00000000, handle @0x12c
2019-01-22 10:19:05, Info                  CSI    0000000a@2019/1/22:01:19:05.296 CSI perf trace:
CSIPERF:TXCOMMIT;2808573

Errorが発生している箇所を見ると、conhost.exeのところでERROR_SHARING_VIOLATION(0x80070020)が発生しているようです。
ERROR_SHARING_VIOLATION はほかのプロセスとの排他処理によってエラーが発生していることを示しています。

注目するのはErrorの少し手前の行。”SQM: Reporting poqexec status with status: 0xc0000043, failed file: conhost.exe, interfering process: tmbmsrv.exe,conhost.exe,conhost.exe, context: Startup, first merged sequence: 1613″のところです。 “failed file: conhost.exe”に続く”interfering process: “のところで、原因となった可能性のあるプロセスが列挙されています。そこには”tmbmsrv.exe”の表記が・・・・

“tmbmsrv.exe”ってトレンドマイクロのアンチウィルス・・・セーフモードで起動して、コントロールパネルのサービスから アンチウィルス のサービスを無効にして再起動。アンチウィルスが動作しない状態にして、Windows Updateを実行すると・・・成功しました。

購入した電子書籍が読めなくなるとき・・・

わりとリツイートされていたので補足。電子書籍が出版社の都合で突然読めなくなる場合があるのは、これが「期間の定めのない契約」による所が大きいのです。

電子書籍の販売はAmazonの場合は次の様な契約関係にあります。
電子書籍の利用者はAmazonを通じて代金を支払います。利用者が支払った代金は仲介手数料やシステム手数料などを差し引いた後に、出版社に支払れます。実際にはAmazonは仲介するのみで、利用者は出版社に代金を支払い、利用者と出版社の間でコンテンツ提供の契約をおこなっています。

この契約には期間の定めがありません。一般的な感覚だと「期間の定めのない契約」は、未来永劫にわたって契約を遂行する義務があるように感じるかもしれません。ですが法律上の「期間の定めのない契約」は合理的な理由があり、十分な告知期間を設ければ、何時でも解約して良い契約とされています。合理的な理由には以下のようなものが想定できるでしょう。
・出版社が倒産した場合
・出版社またはAmazonが電子出版事業を終了した場合
・出版社と著作権者との契約が終了した場合
・自主規制等により書籍の販売を終了する場合。
電子出版以外での判例を見る限り、告知期間はおおむね四ヶ月程とれば妥当とされているようです。

むろん上記以外でも、合理的な理由があり、妥当な告知期間を設ければ、一方的に解約する事ができます。もしも不服であるなら民事訴訟で「社会通念上合理的と言える理由か?」を争うことになります。でも日本の司法は実損主義なので、仮に裁判で争って勝訴したとしても購入代金の返金を受けられる程度でしかなく、実際に訴訟を起こすのは難しいでしょう。