Division By Zero

ゼロで割る

Aipo8のSchedule Portletをコンパイルしてみた+スケジュールをタイムラインに載せないようにした

前回のエントリが役に立ったので今回もメモ。

Aipo7.0.2ををAipo8.1.1に更新。7.0.2は、当初CentOS4上で運用していたが、途中、CentOS6上で運用するように変更。当然ながらOSが変わってもDBバックアップ、リストアで問題が起きることはなかった。そして、今回はAipo8.1.1に更新。こちらも問題なし。SSLで運用しており、Aipo7ではAndroidからアクセスするために、若干の設定を行う必要があったが、今回はそれも不要。きちんと更新できることは大いに有り難い。

自分で入れた些細な変更についてはこちらこちらに書いたが、今回も以下の3ファイルを修正。

aipo/portlets/schedule/src/main/java/com/aimluck/eip/schedule/

  • ScheduleFormData.java
  • ScheduleWeeklyJSONFormData.java
  • CellScheduleFormNoteData.java

スタートガイドに従えばコンパイルできるはずだが、昔の話なので再度掲載。パスも変わってた。

  1. すでにAipo8をバイナリでインストールした検証環境がある
  2. JDKMavenだけインストール
  3. Schedule Portletの上記3ソースを修正
  4. コンパイル(mvn install)
  5. 生成されたaipo-portlet-schedule-8.1.1.jarを/usr/local/aipo/tomcat/webapps/ROOT/WEB-INF/lib/のものと入れ替える
  6. aipoを再起動(service aipo stop; service aipo start)

Aipo8.1.1ではmvnでエラーが出たので、格好悪いけど下記で対処。javaを使うことはほとんどないので。Aipo8.1の時はエラーが出なかったと記憶(検証してから本番適用までの間に8.1.1が出てた!)

export JAVA_HOME=/usr

うまく動いたので今日はこれで終了!

*** ScheduleFormData.java.org   2016-03-29 13:38:15.845649764 +0900
--- ScheduleFormData.java       2016-04-01 22:45:53.362517549 +0900
*************** public class ScheduleFormData extends AL
*** 1347,1359 ****
          ownerid);

        // アクティビティが公開スケジュールである場合、「更新情報」に表示させる。
!       if ("O".equals(public_flag.toString())) {
          ScheduleUtils.createNewScheduleActivity(
            schedule,
            loginName,
            "new",
            ownerid);
!       }
      } catch (CayenneRuntimeException e) {
        if (e.getCause().getMessage().indexOf("Incorrect string value:") == 0) {
          msgList.add(ALLocalizationUtils
--- 1347,1359 ----
          ownerid);

        // アクティビティが公開スケジュールである場合、「更新情報」に表示させる。
! /*      if ("O".equals(public_flag.toString())) {
          ScheduleUtils.createNewScheduleActivity(
            schedule,
            loginName,
            "new",
            ownerid);
!       }*/
      } catch (CayenneRuntimeException e) {
        if (e.getCause().getMessage().indexOf("Incorrect string value:") == 0) {
          msgList.add(ALLocalizationUtils
*************** public class ScheduleFormData extends AL
*** 1377,1383 ****
            // パソコンへメールを送信
            List<ALEipUserAddr> destMemberList =
              ALMailUtils.getALEipUserAddrs(memberList, ALEipUtils
!               .getUserId(rundata), false);
            String subject = "[" + ALOrgUtilsService.getAlias() + "]スケジュール";
            String orgId = Database.getDomainName();

--- 1377,1383 ----
            // パソコンへメールを送信
            List<ALEipUserAddr> destMemberList =
              ALMailUtils.getALEipUserAddrs(memberList, ALEipUtils
!               .getUserId(rundata), true);
            String subject = "[" + ALOrgUtilsService.getAlias() + "]スケジュール";
            String orgId = Database.getDomainName();

*************** public class ScheduleFormData extends AL
*** 1948,1954 ****
            // パソコンへメールを送信
            List<ALEipUserAddr> destMemberList =
              ALMailUtils.getALEipUserAddrs(memberList, ALEipUtils
!               .getUserId(rundata), false);
            String subject = "[" + ALOrgUtilsService.getAlias() + "]スケジュール";

            if (edit_repeat_flag.getValue() == FLAG_EDIT_REPEAT_ONE) {
--- 1948,1954 ----
            // パソコンへメールを送信
            List<ALEipUserAddr> destMemberList =
              ALMailUtils.getALEipUserAddrs(memberList, ALEipUtils
!               .getUserId(rundata), true);
            String subject = "[" + ALOrgUtilsService.getAlias() + "]スケジュール";

            if (edit_repeat_flag.getValue() == FLAG_EDIT_REPEAT_ONE) {
*************** public class ScheduleFormData extends AL
*** 2404,2410 ****
              // パソコンへメールを送信
              List<ALEipUserAddr> destMemberList =
                ALMailUtils.getALEipUserAddrs(memberList, ALEipUtils
!                 .getUserId(rundata), false);
              String subject = "[" + ALOrgUtilsService.getAlias() + "]スケジュール";
              String orgId = Database.getDomainName();

--- 2404,2410 ----
              // パソコンへメールを送信
              List<ALEipUserAddr> destMemberList =
                ALMailUtils.getALEipUserAddrs(memberList, ALEipUtils
!                 .getUserId(rundata), true);
              String subject = "[" + ALOrgUtilsService.getAlias() + "]スケジュール";
              String orgId = Database.getDomainName();
*** ScheduleWeeklyJSONFormData.java.org 2016-03-29 13:38:19.937649759 +0900
--- ScheduleWeeklyJSONFormData.java     2016-03-29 13:40:37.493649863 +0900
*************** public class ScheduleWeeklyJSONFormData
*** 532,538 ****
                // パソコンへメールを送信
                List<ALEipUserAddr> destMemberList =
                  ALMailUtils.getALEipUserAddrs(memberList, ALEipUtils
!                   .getUserId(rundata), false);
                String subject = "[" + ALOrgUtilsService.getAlias() + "]スケジュール";

                List<ALAdminMailMessage> messageList =
--- 532,538 ----
                // パソコンへメールを送信
                List<ALEipUserAddr> destMemberList =
                  ALMailUtils.getALEipUserAddrs(memberList, ALEipUtils
!                   .getUserId(rundata), true);
                String subject = "[" + ALOrgUtilsService.getAlias() + "]スケジュール";

                List<ALAdminMailMessage> messageList =
*************** public class ScheduleWeeklyJSONFormData
*** 704,710 ****
                // パソコンへメールを送信
                List<ALEipUserAddr> destMemberList =
                  ALMailUtils.getALEipUserAddrs(memberList, ALEipUtils
!                   .getUserId(rundata), false);
                String subject = "[" + ALOrgUtilsService.getAlias() + "]スケジュール";

                List<ALAdminMailMessage> messageList =
--- 704,710 ----
                // パソコンへメールを送信
                List<ALEipUserAddr> destMemberList =
                  ALMailUtils.getALEipUserAddrs(memberList, ALEipUtils
!                   .getUserId(rundata), true);
                String subject = "[" + ALOrgUtilsService.getAlias() + "]スケジュール";

                List<ALAdminMailMessage> messageList =
*************** public class ScheduleWeeklyJSONFormData
*** 866,872 ****
              // パソコンへメールを送信
              List<ALEipUserAddr> destMemberList =
                ALMailUtils.getALEipUserAddrs(memberList, ALEipUtils
!                 .getUserId(rundata), false);
              String subject = "[" + ALOrgUtilsService.getAlias() + "]スケジュール";

              List<ALAdminMailMessage> messageList =
--- 866,872 ----
              // パソコンへメールを送信
              List<ALEipUserAddr> destMemberList =
                ALMailUtils.getALEipUserAddrs(memberList, ALEipUtils
!                 .getUserId(rundata), true);
              String subject = "[" + ALOrgUtilsService.getAlias() + "]スケジュール";

              List<ALAdminMailMessage> messageList =
*************** public class ScheduleWeeklyJSONFormData
*** 1028,1034 ****
              // パソコンへメールを送信
              List<ALEipUserAddr> destMemberList =
                ALMailUtils.getALEipUserAddrs(memberList, ALEipUtils
!                 .getUserId(rundata), false);
              String subject = "[" + ALOrgUtilsService.getAlias() + "]スケジュール";

              List<ALAdminMailMessage> messageList =
--- 1028,1034 ----
              // パソコンへメールを送信
              List<ALEipUserAddr> destMemberList =
                ALMailUtils.getALEipUserAddrs(memberList, ALEipUtils
!                 .getUserId(rundata), true);
              String subject = "[" + ALOrgUtilsService.getAlias() + "]スケジュール";

              List<ALAdminMailMessage> messageList =
*** CellScheduleFormNoteData.java.org   2016-03-29 13:38:11.141649716 +0900
--- CellScheduleFormNoteData.java       2016-03-29 13:39:02.164650595 +0900
*************** public class CellScheduleFormNoteData ex
*** 731,737 ****
          // パソコンへメールを送信
          List<ALEipUserAddr> destMemberList =
            ALMailUtils.getALEipUserAddrs(form_data.getMemberList(), ALEipUtils
!             .getUserId(rundata), false);
          String subject =
            ALLocalizationUtils.getl10nFormat(
              "SCHEDULE_SUB_SCHEDULE",
--- 731,737 ----
          // パソコンへメールを送信
          List<ALEipUserAddr> destMemberList =
            ALMailUtils.getALEipUserAddrs(form_data.getMemberList(), ALEipUtils
!             .getUserId(rundata), true);
          String subject =
            ALLocalizationUtils.getl10nFormat(
              "SCHEDULE_SUB_SCHEDULE",
*************** public class CellScheduleFormNoteData ex
*** 1256,1262 ****
          // パソコンへメールを送信
          List<ALEipUserAddr> destMemberList =
            ALMailUtils.getALEipUserAddrs(form_data.getMemberList(), ALEipUtils
!             .getUserId(rundata), false);
          String subject =
            ALLocalizationUtils.getl10nFormat(
              "SCHEDULE_SUB_SCHEDULE",
--- 1256,1262 ----
          // パソコンへメールを送信
          List<ALEipUserAddr> destMemberList =
            ALMailUtils.getALEipUserAddrs(form_data.getMemberList(), ALEipUtils
!             .getUserId(rundata), true);
          String subject =
            ALLocalizationUtils.getl10nFormat(
              "SCHEDULE_SUB_SCHEDULE",

CentOS 6.7にPacketbeatをインストールした際のメモ

Packetbeatの1.0.0-rc1がリリースされたので、手持ちのCentOS 6.7のマシンにインストールしてみた。

May 27, 2015 –

Elastic, the company behind the popular open source projects Elasticsearch, Logstash, and Kibana with more than 20 million downloads, today announced it has acquired Packetbeat, a real-time network packet analytics solution built natively on Elastic’s technology stack, as well as unveiled a new open source framework called Beats for anyone to build data shippers on top of Elasticsearch.

https://www.elastic.co/about/press/elastic-acquires-packetbeat

Packetbeatはオープンソース全文検索エンジンElasticsearchのと連携するネットワークパケット解析ソリューションで、今年の5月にElastic社が買収している。

After spending a decade working in networking packet analytics, Packetbeat founders Monica Sarbu and Tudor Golubenco experienced first-hand the complexity of analyzing and troubleshooting wire data. Realizing that existing solutions were mostly proprietary and not able to extract real-time application-level data from network packets, Monica and Tudor sought out to create a new solution based on Elasticsearch and Kibana. With a vision to help fellow IT and network operators tap into complex, distributed systems, Packetbeat was created as the first open source solution for network packet analytics to extract real-time insights from wire data.

https://www.elastic.co/about/press/elastic-acquires-packetbeat

引用文にあるように、キャプチャしたパケットをリアルタイムに解析してグラフィカルに表示するというソリューションは、プロプライエタリのものなら10年以上前からいくつも存在しているが、定評あるオープンソース全文検索エンジンと組み合わせて、すぐに使えるレベルというものはなかった。触り始めた段階の印象としては、Elasticsearchで大量のサーバーログの解析をするのと同じように、サーバーのパケットを解析するためのツール、といった感じで、「パケット」を中心に据えたものとは一線を画している(と思う)。

インストールは公式サイトにある手順で全く問題なかった。今回はいろいろNICも増設してあるものの最新でも何でもないXeon E5506を載せたCentOS 6.7 x64のPCにインストールしてみた。ElasticsearchもKobanaも何もないところからのインストールだ。

まず、Elasticsearchをインストールして起動。

sudo yum install java-1.7.0-openjdk
curl -L -O https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/rpm/elasticsearch/2.0.0/elasticsearch-2.0.0.rpm
sudo rpm -i elasticsearch-2.0.0.rpm
sudo service elasticsearch start

次に、Kibanaをインストール。

curl -L -O https://download.elastic.co/kibana/kibana/kibana-4.2.0-linux-x64.tar.gz
tar xzvf kibana-4.2.0-linux-x64.tar.gz
cd kibana-4.2.0-linux-x64/
./bin/kibana

デフォルトポートは5601なので、ブラウザからhttp://[IPアドレス]:5601でKibanaが開く。

Packetbeat用のダッシュボードもインストールしておく。

curl -L -O http://download.elastic.co/beats/dashboards/beats-dashboards-1.0.0-rc1.tar.gz
tar xzvf beats-dashboards-1.0.0-rc1.tar.gz
cd beats-dashboards-1.0.0-rc1/
./load.sh

No default index patternというエラーが出るので、Indicesのタブで[Packetbeat-]YYYY.MM.DDを選び、さらに★のマークをクリックしてデフォルトインデックスとして設定する。今度はDashboardタブのフォルダアイコンをクリックして、HTTPをクリックするとダッシュボードが開く。

最後にPacketbeatをインストールする。

sudo yum install libpcap
curl -L -O https://download.elastic.co/beats/packetbeat/packetbeat-1.0.0-rc1-x86_64.rpm
sudo rpm -vi packetbeat-1.0.0-rc1-x86_64.rpm

手元の環境ではlibpcapはインストールずみだった。
設定は/etc/packetbeat/packetbeat.ymlにあるが、とりあえずそのままで。この場合、全NICがキャプチャ対象となるが、非プレミスキャスモードとなる。

インデックステンプレートをロードして起動。

curl -XPUT 'http://localhost:9200/_template/packetbeat' -d@/etc/packetbeat/packetbeat.template.json
sudo /etc/init.d/packetbeat start

これで下記のようにHTTPトラフィックを発生させると、Kibanaに表示される。

curl http://www.elastic.co/ > /dev/null

実に簡単に動作した。素晴らしい!とりあえず今日はここまで。

Windows Server 2012R2 Essentialsでトップレベルドメインを設定する

Windows Server 2012R2 Essentialsでトップレベルドメインを.local以外に設定しようとしてつまづいたのでメモ。

This is by design to simplify user experiences.

http://support.microsoft.com/kb/2830511

ってあるけどホントかな。cfg.iniを作成してリムーバブルメディアに置く方法が書かれているが、今回、構成ウィザードをキャンセルして、PowerShellで設定してみた。

1. Enter the Powershell prompt.


2. To get the credentials to create your domain admin account enter the following:
PS C:\> $cred = Get-Credential –UserName LocalAdmin –Message “Please specify the password for your new administrator account.”


3. To start the domain controller promotion commandlet enter the following:
PS C:\> Start-WssConfigurationService -CompanyName “Contoso” -DNSName “Test.Contoso.com” -NetBiosName “Test” -ComputerName “YourServerName” –NewAdminCredential $cred -Setting All

http://carlosxmunoz.wordpress.com/2013/12/15/how-to-specify-windows-2012r2-essentials-top-level-domain-tld-suffix/

うまくいきました!

CVE-2014-6271, CVE-2014-7169, CVE-2014-7186, CVE-2014-7187, CVE-2014-6277, CVE-2014-6278 (bash脆弱性)のCentOS4用パッケージをビルドしてみた

[2014/09/27追記]CVE-2014-7169を加えて修正
[2014/10/09追記]CVE-2014-7186, CVE-2014-7187, CVE-2014-6277, CVE-2014-6278を加えて追記

巷ではbash脆弱性(CVE-2014-6271,CVE-2014-7169,CVE-2014-7186,CVE-2014-7187,CVE-2014-6277,CVE-2014-6278)が問題になっている。内容が内容だけに、外につながっているいないに関わらず、社内にCentOS4の装置が残っている当方としては少し心配。

検索してみると、下記の質問が見つかった。

For reasons too stupid for me to explain in public, I am responsible for a server running RHEL 4 and with no update subscription. I could build a clone to test this, but I hope someone will have a direct answer.
1.Has /bin/bash from Centos 4 been patched, or will it be?
2.Can I just plop a (presumably patched) Centos 4 /bin/bash into my RHEL system as a workaround that will buy me several weeks? (I need until December 10)

http://serverfault.com/questions/631055/mitigating-remote-code-execution-through-bash-envronment-variables-cve-2014-627

で、ごくまっとうな回答。

Your only options are to
" Buy a support contract with RedHat
" Try to build your own package for Bash.
" Or the winning option: Retire this machine and use this security issue as an incentive to do so.

http://serverfault.com/questions/631055/mitigating-remote-code-execution-through-bash-envronment-variables-cve-2014-627

仕方ないのでビルドしてみた。(自己責任でお願いしますね)

まず、テスト環境にソースをダウンロードして、インストール。今は簡単にVMで試せて便利。

# wget ftp://rpmfind.net/linux/redhat/linux/updates/enterprise/4WS/en/os/SRPMS/bash-3.0-27.el4.src.rpm
# rpm -ivh bash-3.0-27.el4.src.rpm

つぎに、パッチをダウンロード。

# cd /usr/src/redhat/SOURCES
# wget http://ftp.gnu.org/gnu/bash/bash-3.0-patches/bash30-017
# wget http://ftp.gnu.org/gnu/bash/bash-3.0-patches/bash30-018
# wget http://ftp.gnu.org/gnu/bash/bash-3.0-patches/bash30-019
# wget http://ftp.gnu.org/gnu/bash/bash-3.0-patches/bash30-020
# wget http://ftp.gnu.org/gnu/bash/bash-3.0-patches/bash30-021
# wget http://ftp.gnu.org/gnu/bash/bash-3.0-patches/bash30-022

/usr/src/redhat/SPECS/bash.specの29行目以降にbash30-017, bash30-018, bash30-019, bash30-020, bash30-021, bash30-022を追加する。

27 Patch15: bash30-015
28 Patch16: bash30-016
29 Patch17: bash30-017
30 Patch18: bash30-018
31 Patch19: bash30-019
32 Patch20: bash30-020
33 Patch21: bash30-021
34 Patch22: bash30-022

117行目以降にも追加。

115 %patch15 -p0 -b .015
116 #%patch16 -p0 -b .016
117 %patch17 -p0 -b .017
118 %patch18 -p0 -b .018
119 %patch19 -p0 -b .019
120 %patch20 -p0 -b .020
121 %patch21 -p0 -b .021
122 %patch22 -p0 -b .022

4行目にモジュール名があるので、それらしく変更。

4 Release: 27.4.el4

/usr/src/redhat/SOURCES/bash30-017を開くと、対象パスが../bash-3.0.16/となっているので、../bash-3.0-patched/と修正。18, 29, 56行目の3つあった。さらに、patch16は適用されていないので、97行目のPATCHLEVELを15に変更。

同様に、/usr/src/redhat/SOURCES/bash30-018の18行目、/usr/src/redhat/SOURCES/bash30-019の20行目、/usr/src/redhat/SOURCES/bash30-020の19行目、/usr/src/redhat/SOURCES/bash30-021の20, 30行目、/usr/src/redhat/SOURCES/bash30-022の19, 81, 100行目、/usr/src/redhat/SOURCES/bash30-020の19行目、


rpmbuildでrpmを生成。

# cd /usr/src/redhat/SPECS
# rpmbuild -ba bash.spec

/usr/src/redhat/RPMS/i386/bash-3.0-27.4.el4.i386.rpmを対象ホストにインストールすれば終了。

# rpm -Uvh bash-3.0-27.4.el4.i386.rpm

テストも忘れずに。

# env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
this is a test

[2014/10/09追記]テストも複雑になってきました。こちらのスクリプトで。


いちいちこんなことやってられないので、早く新しいサーバーを立てよう、と決意を新たに、今日はこれで終了!(最後に引用)

" Or the winning option: Retire this machine and use this security issue as an incentive to do so.

http://serverfault.com/questions/631055/mitigating-remote-code-execution-through-bash-envronment-variables-cve-2014-627

Beamr Videoが950万ドルを調達

以前紹介したBeamr Videoが950万ドルを調達した、と報道されている。少し古いが2014年4月8日のGLOBESの記事。

Video optimization provider Beamr has closed a $9.5 million financing round led by venture capital firms Marker LLC and Google chairman Eric Schmidt's Innovation Endeavors.

http://www.globes.co.il/en/article-video-optimization-co-beamr-raises-95m-1000930651

Marker LLCはNew YorkとイスラエルのHerzliyaを本拠とするベンチャーキャピタル。Innovation Endeavorsは、常に、Googleエリック・シュミット会長の、と修飾されるPalo Altoのベンチャーキャピタル

The technology has been installed at Hollywood's major studios, and commercial deployment is expected soon.

http://www.globes.co.il/en/article-video-optimization-co-beamr-raises-95m-1000930651

JPEGmini譲りの最適化技術は既にハリウッドの主要スタジオに導入され、商用稼働も近い、とのことだ。現行製品がサポートするH.264は、4Kを見据え、さらに倍の圧縮率を持つH.265に移行されていくという線が濃厚だが、今回得た資金で、8K対応、あるいは、H.265対応を進めていくようだ。

The company plans to use the investment funds from this financing round to accelerate the development of its Ultra-HD and HEVC optimization technologies that will enable "over-the-top" streaming of Ultra-HD (4K) content to broadband-connected consumers.

http://www.globes.co.il/en/article-video-optimization-co-beamr-raises-95m-1000930651

静止画における視覚ベースでの最適化の有効性はJPEGminiで証明されている、と言っていいだろう。撮影対象が一枚一枚が大きく異なる静止画に対しては、Q値が視覚に対してどれだけ影響力を持つかを事前に判断するのは難しく、大量の静止画に対しては、一律保守的な値に設定せざるを得ない。自動的に適切な圧縮率を選んでくれるJPEGminiは、用途によってはとても便利な技術だ。

ただ、動画に対してはどうか。アニメや古CGを除けば、2時間の実写映画はどれも似たり寄ったりになり、二枚の静止画ほど差異がないということはないだろうか。x264にある固定品質モードのようなものでも十分だということはないか。また、JPEGとは異なり、動画コーデックは発展途上の技術。H.264やH.265で留めておく必要性もない。

とはいえ、最近思うのは、資金を調達し優秀な頭脳を集めて開発すれば、どんな技術も他を凌駕するものになりうるのではないか、ということ。主流の映像コーデック技術者とは着眼点の異なるこの技術、注目して見て行きたい。

FBI:自動運転車は車輪付きの爆弾になる

Homeland Security News Wireに2014年7月21日に投稿された「FBI: driverless cars could be used as bombs-on-wheels」の翻訳記事です。元記事はこちらから。


FBI(米連邦捜査局)は、Googleや他の企業が市場にもたらすであろう自動運転車は、高速度での逃走劇で、追う者よりも逃げる者を有利にするような「ゲームのルールを変える」車になり得ると考えている。ある報告書は、自動運転車が「致命的な凶器」として利用される可能性についても警告している。

ガーディアン紙が公文書請求にて入手した機密扱いではないが制限された報告書によると、FBIは「自動運転車は、法の執行者とその敵対者が自動車に対して行えることを変えることに大きな影響を与える」と考えている。

同報告書の「マルチタスキング - 一度に複数の仕事をこなす」という章では、「両手を必要とする動作や道路から目を離す、といった今日では不可能なことを悪者が行えるようになる」と記されてある。

例えば、逃走車から追跡者を銃撃するなどといったシナリオが考えられる。

自動運転車は、建物や道路、歩行者、他の自動車を含んだ周囲のデジタル3Dマップを構築するために、レーザー測距や、レーダー、ビデオカメラ、GPSを利用している、と同紙は報じている。自動運転車は、障害物を避け、(通常は)交通ルールに従って、安全に目的地に到着するようにプログラムされている。

FBI戦略的課題グループの調査官による同報告書は、「自動運転…によって交通はより効率的になるが、アプリケーション悪用の可能性や、自動車を致命的武器にする方法を大きく切り開いてしまう。

安全のための機能が、犯罪者によって逆に信号無視やスピード違反を行うように書き換えられてしまったり、テロリストが爆発物を積載した車を自動運転する「車輪付きの爆弾」に仕立ててしまうことが懸念される。

自動運転車を生産しようとしている企業は、安全性を強調する。Google社は、彼らの最新の自動運転車について次のように述べている。「自動運転車は人間の介入を必要とせずに、安全かつ自律的に動作するように設計される。ソフトウェアとセンサーが全ての作業を行う。自動車は非常に基本的なものになるが、ボタンを押すだけで行きたいところに行けるようになる。」

このFBI報告書は、適切に動作している自動運転車が、事故数を減らすことに役立つことを認めている。「手動操作から生じる衝突事故に結びつく注意不足や下手な判断といったリスクは大幅に減少するだろう」と同報告書は述べる。

ロンドン警視庁の車両が1日に12件ほどの自動車事故を起している中、米国では年間約80人が緊急車両によって生命を奪われている。追跡や現場への到着を遅らせるような3ポイントターン*1や、他の難しい操作を、自動運転車で最適化することができるだろう、と同報告書は述べている。

FBIはまた、次世代のロボットカーでは、車両の追跡はより簡単になる、と述べている。「パトカーが対象車両を見失うことが少なくなり、監視はより効果的かつ容易になるだろう。さらに、パトカーで空に気付かれないように距離をとりながら追跡したり、交差点で意図的に別の進路をとりつつも、後に合流する、といったような制御も実現できる」と同報告書は述べる。

アメリカ国民の自動運転車の使用は、5年ないし7年以内に、議会で承認される可能性があるとFBIは述べている。

ガーディアン紙は、また、少なくとも当分の間は、FBIや他の法執行機関は自動運転車の追跡について心配する必要はないと述べている。Googleの最新鋭の車両は、わずか時速25マイル(約40キロメートル)に制限されているからである。

*1:訳者注:Uターンできない狭い道路で、一度切り替えしてターンする方法

サイバー脅威:あなたの自動車は安全ですか?

iHLSに2014年6月5日に投稿された「Cyber Threats: Is Your Vehicle Safe?」の翻訳記事です。元記事はこちらから。


近頃、自動車や自動車製品の多くは、インターネットに接続されている多くのPCのように固有のIPアドレスを使用するようになってきている。これは、我々が運転する自動車自体が、今日主にインターネット上に存在する多くのサイバー脅威の影響を直接受けうるということでもある。ハッキングによる自動車の遠隔操作も既に新しい話ではない。米連邦捜査局(FBI)が関与する機密情報へのアクセス権を持っていると主張していた米ジャーナリスト、マイケル・ヘイスティングスは、このハッキングによる自動車の遠隔操作によって殺害されたとも言われている。このような脅威は存在しているが、これまでのところ比較的例外的に考えられていた。しかし、IP アドレスを持ちインターネットに接続する自動車や自動車製品がより多く市場に参入することがこの問題をより複雑にしていく。

ハッカーフォーラムは、PC用とは異なる自動車専用ハッキングツールの需要の高まりを示している。しかしながら、IPアドレスを持ちインターネットに接続している自動車に対してはPC用の攻撃ツールが、自動車の攻撃に対しても便利に利用されてしまうのだ。iHLSのインタビューで、車両向けサイバーセキュリティソリューションを開発しているアリロウ社(Arilou)の創始者ギル・リッチェバーは、次のように語る。「2000年以降に製造された車両のハッキングは可能だが、IPアドレスが入ってくると問題ははるかに複雑になってくる。過去には制御システムに対する攻撃と見なされていた車両に対するハッキング行為が、現在では標準的なIP攻撃に変わり、車両ハッキングはすべてのIPハッカーが挑戦できるものとなってしまった。もはやハッカーが必要とするのは、FMトランスミッターや通信モジュールを介して車両に接続することではなく、インターネット接続のみだ。」

PCに仕掛けられたトロイの木馬は、個人情報の盗難をはじめ、銀行口座やクレジットカード番号などの漏洩など、いくつかの非常に不快な結果をもたらすが、それでもほとんどはお金の問題だ。一方、車両へのサイバー攻撃は、生命に直接関わる。ギルは説明する。「車両にはエンジンやブレーキの制御など重要な機能を持つコンピューターがあり、そこが危うくなれば、攻撃者は多くの異なったことを実行できる。ハッカーは、それらの重要なコンピューターをだますような悪質なメッセージを送信することができる。例えば、表向きは車のセンサーから来たメッセージを送ることで、通常そのメッセージに従いエンジンを制御しているコンピューターに指示できる。自動車がスリップしている、というメッセージを横滑り防止装置に送ることで、ドライバーからブレーキコントロールを奪うことができる。さらに、車両の内部ネットワークに侵入してしまえば、それら車載コンピューターのソフトウェアを書き換えることすら可能だ。」

「道路上に特定の周波数で送信するFMトランスミッターを設置することで*1、私がよく知っているセキュリティ問題を持つ特定の車両に対する時限爆弾のようなものを作れる。ある特定時刻に、影響を受けたその特定車種の全ての車両の制御をドライバーから奪い、加速させるような。」とギル言う。

問題は車両のリモート接続オプションだけではなく、今日の自動車の基板に搭載されているサブシステムやデバイスも含まれる。「いくつかのデバイスは外の世界と通信すると同時に、重要な車載コンピューターが接続されている内部ネットワークにも接続されている。ハッカーがエンターテイメント装置のコンピューターを乗っ取るということは、車載内部ネットワークへのメッセージ送信の準備が整うとということだ」とギルは結論づけた。

*1:訳者注:RDSを想定しています。RDSはヨーロッパ等で普及しているFM放送局の局名や曲名を表示させるサービスです。