piyolog

piyokangoの備忘録です。セキュリティの出来事を中心にまとめています。このサイトはGoogle Analyticsを利用しています。

システムバグ以外の問題もあった米民主党アイオワ州党員集会の集計トラブルをまとめてみた

2020年2月3日夜に米大統領選の指名獲得に向け開催されていた民主党のアイオワ州党員集会(アイオワ・コーカス)で集計システムにトラブルが発生し、集計結果の公表が遅延する事態となりました。原因は初めて導入されたアプリだったと報じられています。*1ここでは関連する情報をまとめます。

悲劇的なバグで集計遅延

  • 2020年2月3日夜にトラブルが発生し集計結果の公表が延期。翌日午後にかけ断続的に結果が公表される事態となった。*2
  • アイオワ州民主党の集会は米大統領選民主党候補者を指名するプロセスで最初に行われるもので、今後の各州の動向に大きな影響を及ぼす。そのため今回のトラブルも注目を浴びる結果となった。
  • 集計結果が確定しない状況から主要な候補者たちが自らの主張で勝利宣言をし、そのまま次のニューハンプシャー州に向かう事態となった。*3
  • 集計トラブルが起きた原因は今回初めて導入されたスマートフォン向けアプリを使ったシステムに起因するもの。電話連絡(ホットライン)で集計対応をとるも、回線がパンクしつながらない状態(1時間以上待たされるケースもあった)となった。*4
  • システム障害は3日19時の終了を受け、ボランティアがデータを送信し始めた19時45分頃に判明。アプリにより集計されたデータに問題はなかったが、その集計データをアイオワ州民主党のシステムへ送信する実装(レポーティングシステム))に不具合があり、部分的なデータのみ送信されていた。
  • 開発ベンダのCEOはこの問題が悲劇的(catastrophic)な影響であったと説明している。*5 システムの問題は同日22時頃には修正され、データがアイオワ州民主党のシステムに送信されるようになった。障害が起きていた時間はおおよそ2時間程度とみられる。
  • 今回のトラブルを受け、「ハッキング・侵入によるものではない」と開発した開発ベンダ、週党本部関係者が否定している。
  • 集計はシステムで行っていたが、証跡として写真、記録票も使用しており一部の地区で3つのデータに矛盾が発生していることが明らかになった。第1回投票、第2回投票、そしてそれを受けた代理人配分の数字全てに食い違いが出ているにもかかわらず、アプリ上は正常に集計できていたことから矛盾の原因を突き止めることに時間を要してしまった。*6
  • 障害発生当初、アイオワ州民主党は敵対的な第三者からの外部干渉を防ぐ目的として、アプリ開発ベンダの名前公表を拒んだ。(翌火曜日にShadow社との契約を認めている。)

f:id:piyokango:20200209025418p:plain
システムバグ以外にも複数の問題があった

話題のアプリを紐解く

f:id:piyokango:20200209034047p:plain
IowareporterApp起動後の画面

  • 集計アプリは「IowaReporterApp」という名前で提供されていた。
  • アプリの開発ベンダはShadow Inc。アイオワ州民主党は同社と契約し州内1765か所の拠点の集計を迅速に行うためにアプリの開発を行っていた。Shadow社が投票に関連するシステムに関わったのは今回が初めてだった。
  • 集計アプリは個人のスマートフォンにダウンロードさせ、それを使いデータ集計を行う方式。アプリの配布はテストサービスとして利用されるTestFairy(Android)、TestFlight(iOS)を通じて行われていた。
  • Shadow社は5日、モバイルアプリで発生した障害への謝罪集計結果に影響はないことをTwitterへ投稿。
  • 2016年の米大統領選の際もアプリが使われていたが、民主党、共和党の両党はMicrosoftが開発を行っていた。今回はMicrosoftは関与していない。
  • MotherboardがIowaReporterAppとみられるデータを入手し、同サイトで公開をしている。*7 これを受け6人の専門家に分析より、次のことが判明したという。*8
(1) React Nativeで実装
  • iOS,Android双方のアプリ開発ができるパッケージ「React Native」で構築されている。アプリ内にはデフォルトのReact Nativeのメタデータが複数含まれていた。
  • チュートリアルに従って作成された成果物の様相だった。スターターキットに追加されているような実装からコーディング方法を学んでるメンターと一緒に行うプロジェクトに似ている印象を受けたという。例えばGoogleで「認証を追加する方法」で検索して調べたようなデジャブを受けたという。

facebook.github.io

(2) シンプルな機能

アプリの機能は次の内容が実装されていた。

  1. アプリ起動後にログインを行い、ログイン後は党集会の実行方法に関連する基本的な情報の確認が行われる。
  2. 地区ID入力時にhttps://idp-caucus-2020.auth0.com/authorizeに接続しに行くことからAuth0社の認証サービスを利用していたとみられる。
  3. 地区責任者は集会出席者の総数入力が求められる。その後第1回投票、第二回投票の投票総数の入力を行う。代理人の数はアプリが計算する。
  4. アプリはこれらの結果を集計し、Google Cloud Functionsで実装されたバックエンドシステムに送信する。バックエンド側はShadowが管理。
  • アプリ上には有権者のデータは含まれておらず、Googleのサーバーへ送信されるデータも集計数のみ。

f:id:piyokango:20200209031904p:plain
現在は認証サーバーに接続できなくなっている。

(3) 実装に潜在的な問題
  • ハードコードされたAPIキーを含むコード上の潜在的な問題が確認された。ただしAPIキーの存在が必ずしもセキュリティ上の問題(脆弱性)になることを意味するものではない。
  • Shadow社はアプリは正しく構築されていると主張している。APIキーやパッケージの詳細から集計対象となる情報にアクセスできるとするのは正しくないと主張。
(4) 数字6桁3回入力でトラブル
  • 認証は次の3つの情報で行われた。地区ID番号、PINコード、二要素認証コード。
  • 3つともすべて数字6桁で構成されていたことから、PINと地区ID番号を間違えて入力するケースが目立ったという。

開発会社と690万円で契約

今回使われたアプリに対しては投票以前から準備不足を指摘する声があったという。

契約金 アイオワ州民主党はShadows社に対し、6万3182ドルを2回に分割して支払い。*9 *10
開発期間 開発を開始したのは2019年8月だが12月まで要件が確定しなかった。そのため実質約2か月間で開発が行われた。
サポート アプリ慣れていない人向けに用意されていたホットラインと問合せ用の回線が同じ電話番号だった。*11
テスト 州全体でのテストは行われていなかった。
導入 アプリは外部干渉保護のために認証システムが複雑*12
その結果ログインできないボランティアが多く発生した。誤った資格情報を入力したことが原因。
ボランティアの多くが集会の直前、あるいは前夜にアプリのインストールを行っていた。不具合を訴えた後再ダウンロードを指示されたが、ダウンロードに必要なパスワード忘れるトラブルも起きた。匿名筋の情報によれば結果的にインストールができた人は地区責任者の4分の1程度だったという。
開発を急いでおりAppleの正式リリースの審査を待つことができなかったためテストサービスを使って配布された。これがインストールの難易度向上に拍車をかける結果となった。
セキュリティ 国土安全保障省は脆弱性試験の実施を申し出たが拒否された。*13
アイオワ州民主党委員長によれば、名前は非公開だがセキュリティ専門家によるチェックをシステムに行っていたとしている。
  • アプリ開発元の非公開対応など不透明性により陰謀論(Shadowが民主党と何らかの取引を行っていた)の発生につながった可能性がある。
  • 各地区の責任者に配布されたテストサービスのリンクは2月4日には機能しなくなっており、アプリが削除されたとみられる。

Shadow社の技術力に疑問?

  • Shadow社がソフトウェア開発ベンダとして能力に疑問符もつけられている。主とする技術領域はテキストメッセージング等 有権者との連絡に関してであり、アプリ開発ではないと関係者も取材に答えている。
  • テキサス州民主党もテキストメッセージベンダーの1つとして2019年は5月、9月と合計2回250ドルずつShadow社へ支払いを行っていた。
  • LinkedInのShadows社従業員と公開している10人の内、CTOのみがプログラミング経験のリストアップを行っている。CTOのKrista Davis氏はGoogleで8年間シニアエンジニア(Google Hangout、Google ドキュメントの担当)として働いた経歴がある。CEOはAppleで品質保証担当のエンジニアとして2年間従事していた。
  • 2月22日のネバダ州党員集会でも同じアプリを使った集計が行われる予定だったが、今回のトラブルを受け同ベンダのアプリ、システムを使った集計作業は見送りとなった。

更新履歴

  • 2020年2月9日 AM 新規作成