プログラミング Tips

ITエンジニアの雑記ブログ。
IT関連ニュースの考察や、プログラミングに関するTipsの備忘録として…
育児や日常の雑記帳としても、記事を投稿していきます。

プログラミングと日常生活に関する情報を発信しています。

カテゴリ: 開発

Mac OSX High Sierra の重大なバグに対する対策を調べて見た(Apple公式)!!

昨日(11/29)に報告された重大な脆弱性に関しての情報まとめと暫定的な対策については、この記事にまとめたが、1日経って11/30にAppleから不具合修正のアップデートがリリースされた!

脆弱性発見から、修正アップデートまでほぼ24時間での対応は、本件の深刻さをあらわしていると思う。

この記事を読んでもまだ対策を取っていない方は、今すぐに対策の実施をオススメする。
放置すると、真面目に…

パソコンが乗っ取られる

可能性があるから!!!笑えない事態です。
中のデータが改ざん、消去されることもあるし、最悪アカウント丸ごと削除されるかもしれない。

話を戻して…
本日Appleが正式にリリースした修正ソフトの適応方法をまとめてみる。非常に簡単で、3分で終わる!!



Apple公式の修正ソフトの適応方法!!

  1. "App Store"アプリを起動する
    Mac OSX High Sierra の重大なバグに対する対策1

  2. "アップデート"タグを選択する
    Mac OSX High Sierra の重大なバグに対する対策2

  3. アップデート可能なアプリが一覧され、"セキュリティアップデート"を選択する
    この説明文からもわかるように、速やかな適応を推奨している。

    Mac OSX High Sierra の重大なバグに対する対策(Apple公式)

  4. しばらくするとアップデートが始まるので完了まで待つ

  5. 完了後、ビルド番号が【17B1003】になっていることを確認。
    適応後、即座に表示されない場合もあります。その際は、再起動後に再確認を試してほしい。

以上!完了したら、修正完了!!
これで終わり!!

ちなみにApple公式の適応方法はここを参照!!

Mac OS バージョンの確認方法!

ちなみに…修正バッチ適応後のビルド番号確認方法がわからなかったり、今回の脆弱性は「Mac OSX High Sierra 10.13.1」というバージョンにあるが、自分のバージョンはなんだ!?と思う方もいるかもしれないので、確認方法も参考までに掲載しておく。

  1. 画面上部左端の"Apple"アイコンをクリック

  2. 一番上の「このMacについて」を選択

  3. ウィンドウが開き、最上部にOSの名前、2段目にバージョンとビルド番号が表示される

今回は、ここを確認しバージョン名【Mac OSX High Sierra】、バージョン番号【10.13.1】が表示されたら、危険な状態!と判断して、修正ソフトを直ちに適応してほしい。

修正ソフト適応後は、ビルド番号が【17B1003】になっていることを確認すればよい。

今回の修正ソフトに関する Apple 公式声明について記載しておく

まずこちらに修正ソフトに関して Apple公式の説明が掲載されている。
それによると…

Security Update 2017-001

Released November 29, 2017
Directory Utility
Available for: macOS High Sierra 10.13 and macOS High Sierra 10.13.1
Not impacted: macOS Sierra 10.12.6 and earlier
Impact: An attacker may be able to bypass administrator authentication without supplying the administrator’s password
Description: A logic error existed in the validation of credentials. This was addressed with improved credential validation.
CVE-2017-13872

訳すと…

セキュリティアップデート2017-001

2017年11月29日リリース
ディレクトリユーティリティ
利用できるもの:macOS High Sierra 10.13およびmacOS High Sierra 10.13.1
影響を受けない:macOS Sierra 10.12.6以前
影響:攻撃者は管理者のパスワードを入力せずに管理者の認証をバイパスできます
説明:資格情報の検証に論理エラーが存在しました。 これは、信任状の検証が改善されたことで対応されました
CVE-2017-13872



MacOSX High Sierra の重大なバグとその対策方法を調べてみた!!

<更新>
一晩たって、Appleから正式に修正版ソフトがリリースされた。
その適法方法や対策内容については、こちらを参照してほしい。
<以上、更新>

<更新2>
Appleからの正式な修正版ソフトのリリースについての記事をかいたが…
なんとその中には別の不具合が含まれていたようです。その件についても記事にまとめたので、ここにまとめておく。
<以上、更新>

緊急事態です!

ネット上の至る所で騒がれていますが、MacOSX の最新版OS "High Sierra"に重大な不具合があることが発表された!この不具合は、放っておくと最悪PCを乗っ取られて、データを消されたり、犯罪の踏み台にされる可能性があるので、すぐに対応を打つことをオススメする!!

何を隠そう、私自身もこのOSにアップデートしてしまった一人…

なので、自分自身を実験台にしつつ、公表されている対策を試してみようと思う。

この記事を読んでまだ対策を打っていない「あなた」!!

自分は大丈夫〜と呑気なことを言っていないで、すぐに対策することをオススメする!!

まずは不具合の内容から順を追って説明していく、「内容よりもとにかく対策!」と思う方は、記事後半に対策を載せるので、そちらにジャンプしてほしい。



不具合は「"root"というユーザー名を打ち込むだけで誰でもログイン可能」という内容

トルコのエンジニアの投稿によると…

訳すと、

親愛なる@AppleSupport、MacOS High Sierraの巨大なセキュリティ問題に気付きました。ログインボタンを数回クリックすると、誰でもパスワードを空にして「root」としてログインできます。あなたはそれを知っていますか?

という内容。

実際、ユーザ名に"root"と入力して、ログインボタンを数回クリックするうちに、誰でもそのコンピューターにルグインできてしまうのである。

実際に試みている画像がこれである。

拍子抜けするほどに簡単に解除できてしまう。
ご存知の通り、このバグを再現するためには設定アプリから管理画面を開くだけでアクセスできてしまうのである。ハッキングやノットリというレベルであろうか?
いや、それ以前の問題であるように感じた。ここまで読んでお気づきだと思うが…そのくらいまずい脆弱性なのである。

ちなみに、興味本位で再現しないでほしい。なぜなら、"root"IDでパスワード未設定のユーザーが新たに追加されてしまうことを意味するため、ハッカーのアシストをすることと同じだからである。

もし試すのであれば自己責任の上、実施して、実験後は"root"ユーザを削除してほしい。

ログインする何ができてしまうのか?

ここできになるのが、このことだと思う。答えは、いたって簡単。

「なんでもできる!!」

のである。例えば…

  • 管理者の追加
  • セキュリティ設定の変更(ファイアウォールの解除など)
  • データの改ざん、削除…
  • 第三者への攻撃!!
  • 本来のオーナーの排除(既存ユーザーアカウントの削除)

本当にシャレにならない事態である。
採算になるが、だから

何が何でも対策を講じる必要がある!

のである。

リモート接続でのアクセスもできてしまう

さらに悪いことに、この攻撃は、macOS High Sierraマシンに物理的にアクセスできない場合(遠隔地からのリモートアクセス)でも動作します。この脆弱性が VNC と呼ばれるソフトウェアとApple独自の Remote Desktop ソフトウェアのいずれを通じても動作することを確認しました。

この結果、下記2点を満たしている場合、外部からPCが乗っ取られる可能性を示唆しているのである。

  • PCのファイアウォールが無効
  • リモートデスクトップが有効

ここまでくれば、事の重大さに気づいてくれたと思うので、「対策」についてつめてみよう。



最善の方法は、"root"アカウント有効+パスワードを設定する

本件について、Appleは公式に脆弱性の公表を行なっていないが、対策方法は公表していて、その方法がこれである。

そもそも現在の状態を思い出してみると、"root"ユーザーのパスワードが設定されていないことが根本的な問題であるため、敢えて明示的にパスワードを設定することでこの不具合は回避することができる。

もちろん、簡単すぎるパスワードではハッキングのリスクはそれほど変わらない為、なるべく長く複雑な(推測されにくい)パスワードを登録する必要がある。

実際に設定の手順を順に説明していく。

  1. 「システム環境設定」>「ユーザーとグループ(またはアカウント)」をクリック
    MacOSX High Sierra の重大なバグとその対策方法1 MacOSX High Sierra の重大なバグとその対策方法2

  2. ロックアイコンをクリックした後、管理者名とパスワードを入力
    MacOSX High Sierra の重大なバグとその対策方法4

  3. [ログインオプション]> [ネットワークアカウントサーバ]の「接続」をクリック
    MacOSX High Sierra の重大なバグとその対策方法6

  4. [ディレクトリユーティリティを開く]を選択
    MacOSX High Sierra の重大なバグとその対策方法7

  5. [ディレクトリユーティリティ]ウィンドウでロックアイコンをクリックしてから、管理者名とパスワードをもう一度入力
    MacOSX High Sierra の重大なバグとその対策方法8
    MacOSX High Sierra の重大なバグとその対策方法9

  6. メニューバーに移動して[編集]> [ルートユーザを有効にする]を選択

  7. ルートユーザのパスワードを入力。
    MacOSX High Sierra の重大なバグとその対策方法11

最後の手順で入力したものが、"root"のパスワードになる為、以降は攻撃されてもログインされることはない。

ちなみに…
手続きの途中で「ロック解除」を実施してきたと思うが、このままではセキュリティ上よろしくないので、ウィンドウを閉じるか「鍵アイコン」をクリックしてロックしてほしい。

まとめ

もうご理解いただけたと思うが、初歩的すぎるミスが今回の脆弱性の原因である。とはいえ、ミスとは常に単純で気づいてしまえば「なんで気づけなかった!?」と思うほどのものであると思う。

きっと早急に次回OS更新がリリースされると思うが、それまでしばらくは混乱が続くと思う。

この記事が誰かのセキュリティ対策に役に立てたなら幸いである。



文字列から、特定単語を効率よく発見する方法!!

"I like markdown"という文字列から"like"という文字列を探し、最初に見つけた位置("l"の位置)を表示するするプログラムを作成するとしたら…

もっとも基本的なアルゴリズムは、文字列の比較位置を左端から1文字ずつずらして、繰り返しチェックする方法が最初に思いつく。



1文字ずつズラすプログラムのサンプル

C言語のサンプルを載せる。

#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[]) {
    int len1, len2, n, i;
    char* pos;
    char* base = "I like markdown";
    char* key = "like";

    len1 = strlen(base);    // baseの文字列
    len2 = strlen(key); // keyの文字列

    n = len1 - len2;    // 繰り返し回数
    pos = base;     // 比較位置

    for (i = 0; i <= n; i++) {
        if (strncmp(pos, key, len2) == 0) {
            // 見つかった位置の表示
            printf ("%d\n", i);
            break;
        }
        pos++;  // 比較位置を +1ずらす
    }

    return 0;
}

strlen関数は、引数で引数で指定された文字列の文字数を取得。
strncmp関数は、1つ目と2つ目の引数で指定された文字列を比較し、一致すれば0を返し、一致しなければ0以外を返す。

プログラムが正常に動作して、"l"の位置「2」が表示される。

但し、文字列を1文字ずつずらして繰り返しチェックする方法では工夫がない。
工夫を凝らした文字列検索アルゴリズムとして、「ボイヤームーア法」がある。

ボイヤームアー法を調べてみた

ボイやー氏とムーア氏が考案した方法。

このアルゴリズムのポイントは、「"like"4文字を探すので、1文字ずつではなく最大4文字ずつずらす」という点である。【常に4文字ずつずらせるわけではない】点に注意が必要。

"I like markdown"の場合、常に4文字ずつとしてしまうと2回目のチェック位置が、"I li ke m arkdown"になってしまい、"like"を見逃してしまう。

チェック位置を何文字ずらせるか?

答えは、「比較の状況によって変化!」。

そこでボイヤームーア法では、見つけたい文字列を構成する1文字ごとに何文字ずつずらせるかを調査する。

例えば、"I like markdown"に対して、"like"を検索する今回の場合、

  • 1回目:"I li"を検証。全部一致ではないが、末尾"i"が"like"に含まれる。
  • 2回目:先頭2文字が"ke"で一致するかをチェック

同様にして、末尾が"l"であれば、3文字ずらして比較。

つまり、末尾が…

  • "i"の場合、2文字
  • "k"の場合、1文字
  • "e"の場合、4(最大)文字

それぞれずらせる

参考までにボイヤームーア法を用いたサンプルを記す

#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[]) {
    int len1, len2, n, i, inc;
    char* pos;
    char* base = "I like markdown";
    char* key = "like";

    len1 = strlen(base);    // baseの文字列
    len2 = strlen(key); // keyの文字列

    n = len1 - len2;    // 繰り返し回数
    pos = base;     // 比較位置

    i = 0;
    while(i <= n) {
        if (strncmp(pos, key, len2) != 0) {
            switch(*(pos + len2 - 1)) {
                case 'l':  inc = 3; break;
                case 'i':  inc = 2; break;
                case 'k':  inc = 1; break;
                case 'e':  inc = 4; break;
                default:   inc = 4; break;
            }
            i += inc;
            pos += inc;
        } else {
            // 見つかった位置の表示
            printf ("%d\n", i);
            break;
        }
    }
    return 0;
}


最短経路を求める方法を勉強してみた!

出発点から目的地までの最短経路を求めるアルゴリズムを勉強してみた!

ダイクストラほうは、出発点ごろから目的地までの最短経路を求めるアルゴリズムとして有名である。


最短隣接地点を繰り返し求めていく

ダイクストラ方のアイデアは、出発点に隣接する地点までの経路を確定していき、最終的に目的にたどり着く手法である。

確定した地点を太い線で囲み、確定した経路を実践で示すことにする。

出発点である東京は確定しているため、太い線で囲んでおく。出発点であるため確定距離は0キロメートルとする。
東京に隣接しているのは高崎、長野、名古屋である。東京からの距離は、高崎510キロ、長野230キロ、名古屋350キロ。よって最短距離は高崎までの110キロで確定する。なぜなら他の地点を経由して高崎に行くと、長野または名古屋を経由することになるため、高崎に直接行く方法より長くなるからである。

このように現場確定している経路に隣接する地点が複数ある場合、その中にある最短の時点までの経路が確定する。これがダイクストラ方のその中にある最短の時点までの経路が確定する。これがダイクストラ方のアイディアである。

パリティビットとハミング符号について勉強してみた!!

データのエラーチェックで使用される「パリティビット」と「ハミング符号」について、今までよく知らずに使ってきたので、ここでまとめて勉強してみようと思った。

パリティビットはエラーを検出できるがエラーの訂正はできない。 一方、ハミング符号は エラーの検出と訂正ができるという差がある。

これらはどのような仕組みで実現されているのかいくつかのバリエーションが存在するがその一部を備忘録としてここに残す。


パリティビットの仕組み

パリティビットもハミング符号も、データ本体にエラーチェック情報を付加して表現する。 今後はデータ本体のことを「情報ビット」、エラー情報のことを「冗長ビット」とする。

はじめにパリティビットの仕組みを解説。

パリティビットは、情報ビットに1桁の冗長ビットを付加して、データ全体の中にある「1」の数を偶数もしくは奇数に揃えるものである 。それぞれを「偶数パリティ」「奇数パリティ」と呼ぶ。
例えば7桁の

0101010

という情報ビットの先頭に、 偶数パリティで1桁を付加することとする。情報ビットの中には1が3個(奇数) ある。 よって1の個数を偶数にするために先頭に付加する冗長ビットの値は1である。この結果、データ全体が8桁の

10101010

となり、その中にある1の数は4個(偶数)になる。

偶数パリティを使ってデータ通信を行う場合を考える。
送信者側のプログラムでは、7桁の情報ビットの中にある1の数が偶数か奇数かによって冗長ビットの値を0か1に決定する。
受信者側のプログラムでは、冗長ビットと情報ビットを合わせた8桁のデータの中にある1の数が、偶数なら正常だと判定し、奇数ならエラーだと判定する。

データの中にある1の数が偶数か奇数かはXOR(排他的論理和演算)で簡単に判定できる。データを構成するすべての桁でXOR 演算を行った結果が0なら、1は偶数個あったことになる。結果が1なら、1は奇数個あったことになる。 なぜなら、1が偶数の場合1同志をペアにしてXOR演算を行うことができ、その結果が0になるからである(1XOR1=0)。

残った0同士でXOR演算を行った最終的な結果も0になる。それに対して、1が奇数個の場合はペアになれない1が一つ残る。XOR演算をすることになるので、最終的な結果は1になる。

パリティビットは全ての桁をXOR演算する仕組みなので、エラーを検出できてもどの桁がエラーなのかを特定できない。 よってエラー訂正もできない。 さらに、偶数個の桁にエラーがあった場合、それをエラーではなく正常と判断してしまう。 パリティビットは冗長ビットが少なくて済むが、エラーの検出に関しては不十分である。

次に説明するハミング符号は、冗長ビットが多い分だけエラー検出に優れる。

ハミング符号の仕組み

ここでは、情報ビットが4ビット、冗長ビットが3ビットのハミング符号を説明する。情報ビットを構成する各桁を X1, X2, X3, X4で表し、冗長ビットを構成する各桁を P1, P2, P3で表す。また情報ビットの後に冗長ビットを、X1,X2,X3,X4,P1,P2,P3の順に並べる。

冗長ビットP1, P2, P3の値は、以下のように情報ビットから3桁を選んでXOR演算して求める。

P1 = X1 XOR X3 XOR X4
P2 = X1 XOR X2 XOR X4
P3 = X1 XOR X2 XOR X3

例えば情報ビットが0101なら、冗長ビットは101になるので、全体は0101101となる。ハミング符号でエラーチェックを行うときは、以下の式1から式3を使う。

X1 XOR X3 XOR X4 XOR P1 = 0 //式1
X1 XOR X2 XOR X4 XOR P2 = 0 //式2
X1 XOR X2 XOR X3 XOR P3 = 0 //式3

これらは先ほど示したP1,P2,P3を求める式を、取り扱いやすいように変形したものである。三つの式の演算結果が全て0なら、正常と判定できる。三つの式の中に演算結果が1になるものが一つ以上あれば、エラーだと判定できる。この時どの式が1になったかで、情報ビットの何桁目がエラーなのかを特定できる。エラーとは、データの反転のため、何桁目がエラーなのか特定できればエラー訂正も可能となる。

エラーチェックの式で注目すべきは、4桁ある情報ビットから3桁だけを取り出していることである。これが、何桁目がエラーなのかを特定できる仕組みになっている。すべての式に含まれている X1がエラーなら全ての式の演算結果が1になる。X2がエラーならX2を含まない式1の演算結果が0になり、X2を含む式2と3の演算結果が1になる。エラーの桁と式1〜3の演算結果の対応をまとめる。なお、これ以外のパターンで式1〜3のいずれかの演算結果が0でない場合は、複数桁がエラーになっている。この場合は桁を特定できない。

↑このページのトップヘ