Hatena::ブログ(Diary)

stacked tip that high

2018-02-22

不正アクセスの単語整理

セキュリティAPでは午後必須科目ですから、
絶対に覚えたいところですね、17個もありますけど。

ちなみに、その17個は下記参考書に則って選択しています。
「平成29・30年版 ニュースペックテキスト応用情報技術者TAC出版

ソーシャルエンジニアリング

ソーシャル」と聞くとどうしても「社会的な」と翻訳してしまいますが、
元々"social"という英語は「人のあつまりの」という意味がありますから*1
ここから「人を介した(不正アクセス)技術」という意味でこの言葉が使われています。
総務省のHPによれば、

が具体例として挙げられていますが、他にも手口は色々はあります。

キーロガー

キー入力の記録(ログ)を取ることで、パスワードなどの機密情報を盗み出す手法です。

バックドア

"back door"は「裏口」という意味です。
バックドアという不正アクセスは、

  1. まず攻撃対象のパソコン・サーバに裏口を作るソフトを忍ばせ
  2. そのソフトが実行されることで実際に裏口が作られ
  3. その裏口から攻撃を受ける(データの盗み出しなど)

という手口です。

フットプリンティング

直訳すれば「足跡をつけること」であり、そこから、攻撃対象への事前調査を意味します。
whois情報等を調べて、攻撃対象のセキュリティシステムを推測したり、
CGIなどのWebサービスに悪意のある入力を与えた時の反応を見て、
ソフトウェアの弱点を推測したりする手口です。

ブルートフォース攻撃

"brute-force"に「強引な」という意味があります。
このうち"brute"は「獣の」という意味を持っていますが、ややマイナスな印象を持っており、
「野蛮な」「知性の低い」というニュアンスがあります。
総当たり攻撃などが分類されます。

パスワードリスト攻撃

名前の通り、攻撃者が別途入手したパスワードのリストを元に、
パスワードをこじ開けようとする手口です。
パスワードの流用を避ける理由は、パスワードリスト攻撃を回避するためです。

SQLインジェクション

"injection"は「挿入」という意味です。
次の項目のコマンドインジェクションもそうですが、
検索単語が入力されることが期待されているところに、SQLの命令文を混ぜて入力することで、
SQLが想定しない出力をさせて、不正に情報を得る手口のこと。
IPAのHPにも同様の事例が紹介されています。

コマンドインジェクション

上記SQLインジェクションOSコマンド版です。
具体的には、直接OSコマンドを実行できるシェルスクリプトに対して、
キーワード等が入力されることを期待差異れているところに、OSコマンドを混ぜて入力することで、
シェルスクリプトが想定しないOSコマンドを実行し、
不正に情報得たり、データ破壊を行ったりすることです。
IPAのHPでは、コマンドインジェクションで乗っ取ったサーバを経由して、
第三者サーバを攻撃する事例が紹介されています。

クロスサイトスクリプティング

手口としては、上述のSQLインジェクションやコマンドインジェクションと似ています。
「クロスサイト」とは「2つのサイトを跨いで」という意味であり、ここでは、

  1. 不正なスクリプト(命令)を受け付けると、問題のある動作をしてしまうWebサイト
  2. 不正なスクリプトのリンクが貼られているサイト(掲示板サイトなど)

の2つが登場します。そして、ユーザが2.の方のサイトでリンクをクリックしてしまうと、
ユーザが意図せず、問題のあるWebサイトに不正なスクリプトを送ってしまい、
その結果として、ユーザが偽のWebサイトに誘導され、個人情報等をだまし取られてしまう、
というのが代表的な手口です。
IPAのHPで図付きで解説されていますが、私は余りピンときませんでした。

クロスサイトリクエストフォージェリ

"forgery"は「偽造」という意味で、「リクエストフォージェリ」で
サーバへのリクエストを偽造する」ということを指しています。
登場するのは、上述のクロスサイトスクリプティングと似ていて、

  1. 偽造が容易なリクエストを受け付ける、問題のあるWebサイトサーバ
  2. 不正なリクエストを含むURLのリンクが貼られているサイト(掲示板サイトなど)

の2つです。Webサイトサーバへのリクエストは、
本来ユーザが正規の方法で(Webサイト上の操作で)送信しますが、
これを、不正なリクエストを含むURLのリンクをユーザが踏むことで、
ユーザが意図せず、Webサイトサーバにリクエストを送信してしまい、
それを偽造されたリクエストと見抜けないWebサイトサーバが、
ユーザからの意図したリクエストと判断し、それに従った処理をしてしまう、
というのが、クロスサイトリクエストフォージェリの流れです。
これも、IPAのHPに事例が載っています。

ゼロデイ攻撃

ソフトウェアはリリース後に脆弱性が明らかになることがあります。
通常は、脆弱性が発見されるとすぐにその箇所を修正するソフトが配布され、
その配布日をワンデイと呼びます。
ゼロデイ攻撃は、ワンデイより前にその脆弱箇所を突いた攻撃のことです。

ディレクトリトラバーサル攻撃

ディレクトリ」は「フォルダ」とも呼ばれる、
ファイルを(仮想的に)分類・格納するシステムです(と今更説明するまでもないですが)。
"traversal"は「横断する」という意味で、「ディレクトリトラバーサル」とはつまり、
本来は横断されないはずのディレクトリへ不正に横断され、
外部からのアクセスが想定されていないデータへアクセスされてしまう攻撃です。
日経のHPが分かりやすいと思います。

DoS攻撃

"DoS"とは"Denial of Service"の略語で、「サービス妨害」という意味です。
昔からあるサーバ攻撃手法で、大量のリクエストをサーバに送り付ける等の方法で、
サーバ処理負荷を上昇させ、処理を遅くしたり、サーバをダウンさせたりする手口です。
情報を盗み出すというよりも、サービスの妨害やシステムの破壊を目的とした不正アクセスです。

フィッシング

元々は「釣り」を意味する"fishing"から来た言葉ですが、
「偽のWebサイトへ誘導して、個人情報等を盗み取る」という意味から
"phishing"(発音は同じ)と綴られることが多いです。

IPスプーフィング

"spoof"は「だます、ひっかける」という意味ですが、インターネットセキュリティの分野では
「なりすます」という意味を帯びます。
IPスプーフィングとは、IPアドレスをなりすますことで、攻撃をしやすくする手口です。
具体的には、あるサーバに対して、あたかも内部からのアクセスかのようにIPを偽造して
アクセスすることで、相手の防御システムをかいくぐる方法です。

セッションハイジャック

ユーザとサーバとの通信のやり取りを「セッション」と言います。
セッションハイジャックとは、このやり取りに紛れて、サーバに不正な操作を行う攻撃です。

DNSキャッシュポイズニング

DNSURLIPアドレスに変換する(名前解決する)サーバです。
DNSはこの変換を行うために、URLIPアドレスの対応リストを持っていますが、
このリストにないURLを変換する時や、定期的なリスト更新のために、
別のDNSに対してIPアドレスを問い合わせることをします。
この機能を悪用して、

  1. 攻撃者がDNSに対して、DNSが持っていないだろうURLの名前解決をリクエストする
  2. DNSが他のDNSに対して、同様のリクエストをする
  3. その回答が送られてくる前に、攻撃者が偽のIPアドレスの回答を送り付ける
  4. それを正規の回答と勘違いし、自分のリストに追加してしまう

というのが、DNSキャッシュポイズニングです。
"poisoning"は「毒を盛る」という意味です。
この攻撃を受けたDNSを使うと、該当するURLに対して偽のIPアドレスを回答してしまうので、
ユーザは正しいURLを入力したにも関わらず、偽のWebサイトに誘導されてしまうのです。

*1:そして、元々は「村の祭り」という意味でしかなかった「社会」という漢語を、"society"の訳語として日本人が当てたのです。

2018-02-17

原点を通る3次関数の接線の式を代数的に求めてみる

3次関数の接線に関する問題は、接点の座標を使って接線の関数を立て、
その接線が3次関数上にない決められた点を通るので…という流れで解くのがセオリーです。
微分を用いた、いわゆる「逆手流」の解き方ですね。

3次関数y=px^3+qx^2+rx+sの接線が点(a,b)を通るときの、
接線の式を求めよ、という問題は、
接点のx座標をtと置くことで、接線の式を
y=(3pt^2+2qt+r)(x-t)+pt^3+qt^2+rt+sと表せるので、
これが点(a,b)を通るということは、
b=(3pt^2+2qt+r)(a-t)+pt^3+qt^2+rt+sが成り立つので…という流れで、
接点のx座標をtを求め、そこから接線の方程式を求める、
という方法です。

(a,b)がたとえ原点、つまり点(0,0)であっても同様であり、
某有名予備校の某講師曰く、
「ここ(=点(a,b))が原点だとぉ、誘惑に負けて
 y=mxなんて置いちゃう輩がいるけど、駄目だよぉ!」
というやつです。

じゃぁこれを敢えてy=mxと置いて解こうとするとどうなるのか、
ちょっとやってみようと思います。

カルダノ=タリタリアの公式

カルダノ=タリタリアの公式(単にカルダノの公式とも)とは、
3次方程式の解の公式です。
中学・高校で、2次方程式ax^2+bx+c=0の解の公式
x=¥frac{-b¥pm¥sqrt{b^2-4ac}}{2a}
を習いましたが、これの3次方程式バージョンです。

この公式自体については、他の書籍やWebサイトに譲りますが、
導出までの手順としては、

  1. 3次方程式ax^3+bx^2+cx+d=0を立体完成する
  2. x+¥frac{b}{3a}=Xと書き換える
  3. 更にX=u+vで置き換える
  4. 書き換えたuvの式はuv恒等式であることを利用して、u^3+v^3u^3v^3の値を求める
  5. 2次方程式の解と係数の関係を用いて、u^3v^3の値を求める
  6. uvとの関係に注意して、3つのuvの組を求める
  7. ここからXの値を算出し、最後にxの値を算出する

という流れです。

今回は、この流れを途中まで利用して、
先の問題、「接線の式を敢えてy=mxと置いて解いてみる」をやってみます。

方針

接線y=mxが3次関数y=f(x)と接しているということは、
これを連立させることで得られる3次方程式f(x)-mx=0
重解を持っているということになります。

ところで、2次以上の方程式複素数を解に持っている場合、
その共役の複素数も解であるという決まりがありますから、
3次方程式が重解を持っている、という時点で

  • その重解は実数である
  • 残りの解も実数である

ことが判明し、3つの実数解(うち2つは重解)を持っていると言うことができます。

このこと踏まえて、先ほどのカルダノ=タルタリアの公式の流れを進むと、
5.の「u^3v^3を求める」タイミングで、これが重解である必要が出てきます。
これを使って、mの値を求めます。

例題

例題として、次の問題を解いてみます。

3次関数y=x^3-3x^2-1の接線が原点を通るとき、この接線の関数を求めよ

普通に導関数を用いて答えを求めると、
(過程は省略しますが)y=-3xy=¥frac{15}{4}xが正解です。

回答

3次関数の接線として、y軸に平行なものは存在しないので、
原点を通る直線の関数は実数mを用いてy=mxと置ける。

これが3次関数y=x^3-3x^2-1に接しているので、
この2式を連立させyを消去することで得られる
3次方程式x^3-3x^2-mx-1=0が実数の重解を持つことになる。

ここで、この3次方程式を以下のように変形する:
x^3-3x^2-mx-1=0
(x-1)^3-3x-mx=0
(x-1)^3-(m+3)(x-1)-(m+3)=0

ここでx-1=Xと置くと、
X^3-(m+3)X-(m+3)=0となり、
このXの3次方程式が実数の重解を持つこととなる。

更に、X=u+vと置く。
すると、この3次方程式の解の一つの値に対して、自由uを定めることができ、
それに対応してvが定まることになる。
すなわち、X=u+vで置き換えた
(u+v)^3-(m+3)(u+v)-(m+3)=0は、uv恒等式である。

上式を変形すると、
u^3+v^3+¥{3uv-(m+3)¥}(u+v)-(m+3)=0となるが、
式中のu+vについて、

1)u+v=0の場合
u=-vであるので、この式はm=-3となる。
なお、この時X=0x=1であるから、
重解を持つとした3次方程式に代入すると、こちらもm=-3となり矛盾がない。

2)u+v¥neq0の場合
u^3+v^3+¥{3uv-(m+3)¥}(u+v)-(m+3)=0uv恒等式であるので、
u^3+v^3=m+3
uv=¥frac{m+3}{3} i.e. u^3v^3=¥frac{(m+3)^3}{27}
が成り立つ。
従って、u^3v^3は、
t2次方程式t^2-(m+3)t+¥frac{(m+3)^3}{27}=0の解である。

この解を、u^3=¥alphav^3=¥betaとすると、
u={}^{3}¥sqrt{¥alpha}, {}^{3}¥sqrt{¥alpha}¥omega, {}^{3}¥sqrt{¥alpha}¥omega^2
v={}^{3}¥sqrt{¥beta}, {}^{3}¥sqrt{¥beta}¥omega, {}^{3}¥sqrt{¥beta}¥omega^2
(¥omega=¥frac{-1+¥sqrt{3}i}{2}と定義する、これは1以外の1の3乗根2つの内の1つであり¥omega^3=1を満たす。)
となるが、uv=¥frac{m+3}{3}が成立する必要があるので、
1つのuについて、1つのvが対応することになる。
具体的には、uvは実数である必要があるので、3つのuvの組、
(u,v)=({}^{3}¥sqrt{¥alpha}, {}^{3}¥sqrt{¥beta}), ({}^{3}¥sqrt{¥alpha}¥omega, {}^{3}¥sqrt{¥beta}¥omega^2), ({}^{3}¥sqrt{¥alpha}¥omega^2, {}^{3}¥sqrt{¥beta}¥omega)が解となる。

ところで、Xの3次方程式が実数の重解を持つということは、
上記3つの組から算出した3つのu+vの値の内、2つが同一であることを意味する。
つまり、{}^{3}¥sqrt{¥alpha}¥omega={}^{3}¥sqrt{¥beta}¥omega{}^{3}¥sqrt{¥alpha}¥omega^2={}^{3}¥sqrt{¥beta}¥omega^2が成り立つ必要があるので、
u^3v^3を解とするt2次方程式t^2-(m+3)t+¥frac{(m+3)^3}{27}=0の解も
重解であることになる。

この2次方程式の判別式をDとすれば、
D=(m+3)^2-4¥cdot¥frac{(m+3)^3}{27}=0となる。
このmの3次方程式を解くと、
(m+3)^2(1-4¥cdot¥frac{m+3}{27})=0
(m+3)^2(4m-15)=0
m=-3, ¥frac{15}{4}
となる。

1), 2)より、m=-3, ¥frac{15}{4}であるから、
求める接線の関数は、
y=-3xy=¥frac{15}{4}xとなる。

感想

これは、普通に接線の公式を使った方がいいわ。
y=mxなんて置いちゃう輩の末路はこうなるということです。

補足

ちなみに、実は3次方程式にも解の公式というのは存在します。

ax^3+bx^2+cx+d=0a¥neq0)の時、
判別式D
D=-4ac^3-27a^2d^2+b^2c^2+18abcd-4b^3d
となります。
この時、
D>0:異なる3つの実数解を持つ
D=0:重解を持つ(2重解or3重解はわからない)
D<0:1つの実数解と2つの虚数解を持つ
となります。

2017-09-09

ソートアルゴリズム9種を動画で学ぶ

応用情報技術者試験の試験範囲でもある、ソートアルゴリズムは、
疑似コードを見ても今一つピンと来ない。
そういうときは、動画で動きを把握してみましょう。

D

9種はそれぞれ

選択シェル挿入
マージクイックヒープ
バブルコムシェーカー

です。

メジャーなアルゴリズム9種によるソーティングを動画で見ることができます。

  • ランダムな順序のソーティングの他、
  • 逆順序のソーティング、
  • ほぼ整列済み数列のソーティングの

3種類が見られます。

  • どの場合でも速いアルゴリズム、
  • 状態によって速さが変わるアルゴリズム、
  • どの場合でも遅いアルゴリズム

というのが、よくわかりますね。

いかにバブルソートがダメなのかが良く分かります。

追記(2018/5/2)

別のWebサイトで、ソートアルゴリズムを視覚的に見られるものがあったので、
こちらも紹介します。
VisuAlgo - Sorting (Bubble, Selection, Insertion, Merge, Quick, Counting, Radix)

ここでは、

  • バブルソート
  • 選択ソート
  • 挿入ソート
  • マージソート
  • クイックソート
  • ランダムクイックソート
  • 分布数え上げソート
  • 基数ソート

が見られます。

2017-05-05

C言語プログラマがスマホ用アプリ開発を始めるときに役立つWebサイト(適時更新)

C言語プログラマとしての経歴が長い私ですが、
スマホ用アプリ開発(android, java)を始めるときに、お勉強になったWebサイトを適時紹介したいと思います。
(というか、ただの備忘録?)

世界観から再構成しましょう

C言語でPCソフトを作ったりすると、
すべての処理を自分で書かなくてはいけない
という固定概念が染みついてしまいます。
実際にはライブラリ等を使っているので、すべてのコードを自分で書いているわけではないのですが、
それでも、「ライブラリは意識的に使用する道具であり、手間の節約のために使っている」という認識があり、
原則的にはすべてを自分で書かなくてはいけない、と考えていました。

しかしアプリ開発は(一般的には)そうではないのです。



上記リンク先を読んでいただければわかりますが、
原則は「追記」です。
まるで、既存の完成ソフトに追加機能を実装していく派生開発のようなスタイル、これがアプリ開発の基本です。

恐らくPCソフト開発も、大手が作る場合は同じスタイルなのだと思います。
基本となるベースソフト(OOP的にいえば継承元クラス)があり、
それを元に(継承して)新たなソフトウェアを作成していく、という感じなのでしょう。

それがわかっていないと、「extends」や[@Override」が一体何をしているのか、
なんでこんなことをしているのかが見えてこず、
たとえ今までのあなたがプログラマ経験が長い人だったとしても、
アプリ開発についてはド素人のコピペプログラマになってしまいます。

MainActivityの中身は把握しておきましょう

と言われても、C言語プログラマとしては気持ち悪いもの。
C言語を初めて勉強したときの「#includeはお・ま・じ・な・い♪」をあの時呑み込めたのは、
よくわからない気持ち悪いものが#include文ただひとつだけだったからで、
「MainActivity.javaとactivity_main.xmlがまるっとおまじないだよ♪」なんて、
C言語プログラマからすると吐き気を催すレベルです。
(あるいは「やだもう帰る!」と叫んでキーボードをクラッシュするレベル)

なので、せめてこの2つのファイルの中身くらいは意味や機能を知っておきたいものです。



上記サイトでは、コードを一行一行、丁寧に解説してあります。
これを見ると、「あぁ、MainActivityってメインループ的存在なのね」というのがわかります。
(while文などの明示的なループ制御はありませんが、機能としてはメインループの各イベントが
 書かれているものですので、そう言っても間違いはないでしょう)

これらを理解していれば、とりあえずは落ち着いてアプリ開発が始められるかなと思います。

2016-05-22

平均値を使っていい時と、いけない時(アンケート結果と等間隔性)

前回に引き続き、平均値を出発点に、
アンケート項目を構成する際の注意点について議論したい。

前回:平均値を使っていい時と、いけない時(変数・尺度の種類と使用できる分析手法)

得点付け評価

例えば、ある評価対象について、
どれくらい好きか、あるいは、どれくらい嫌いかを評価させたい時に、
いくつかの言葉から適切なものを選択したり、数直線上の目盛りを選択したりする方法がある。
例えば、SD法はその代表的な評価手法である。

SD法は、意味の対立する形容詞を数直線の両端に置き、
評価対象が当てはまる位置を選択することで、
評価対象の持つ「意味の差(Semantic Differential)」を明らかにすることを
目的に、オスグッドにより提案された評価手法である。
(原著(Osgood, 1957)はPDFで一般公開されています。)

オリジナルのSD法では、両端の単語の間の数直線には、
等間隔で目盛りが付されているだけの、シンプルなものである。
これだけであれば、採点者はこの評価項目を少なくとも間隔尺度とみなすことができるだろう。
(もしかしたら比例尺度とみなすかもしれない。)
となると、この「オリジナルの」SD法で得られた結果に対しては、
平均を算出することに統計的意味があることになる。

さて、世の中の得点付け評価の中には、
両端の他に、各目盛りに形容詞などの単語を添えているものもある。
こうなってくると、一概に間隔尺度と言えなくなってくる。
例えば、好きか嫌いかを評価するときに、5つの目盛りを付して
「すごく嫌い」「嫌い」「どうでもいい」「好き」「すごく好き」
と単語を添えたとしよう。

この時、
「どうでもいい」と「好き」の間隔と、
「好き」と「すごく好き」の間隔は、
果たして同じなのだろうか。

これについては、実はいくつか研究があり、規格も存在している。

研究については、SD法が発明された当初から行われている。
例えば織田は、一対比較法に用いる形容詞表現について実験的研究を行い、
評価尺度を作成する際のガイドラインを提案している。
(原著(織田, 1970)はPDFで一般公開されています。)

一方で、関連規格として、
ISO11056:1999があり、日本ではこれを反映させたJIS Z9080:2004がJISになっています。
JISでは、形容詞の例として、

9: 最も快い
8: かなり快い
7: 少し快い
6: わずかに快い
5: 快いとも快くないともいえない
4: わずかに不愉快である
3: 少し不愉快である
2: かなり不愉快である
1: 最も不愉快である

が挙げられている。

また、注釈として、

これらの尺度は,等間隔であるという前提のときだけ間隔尺度である。等間隔でない場合には,順序尺度とみなすべきであるし,また,そう扱わなければならない(7.6.4 参照)。

(中略)

7.6.4 結果の表現 パネルを構成している各評価者からの結果(得点)が得られたら,頻度分布及び中央値の計算によってこれらの結果を統計解析することができる。

とあり、JISにも明確に「等間隔性が担保できないなら、解析は頻度分布や中央値を使って」とあり、暗に平均を使ってはいけないと読み取ることもできる。

間隔尺度と主張するために

前回の記事において、
データ収集者は、解析の幅を広げる目的で、順序尺度よりも間隔尺度を採用したい
ということを書いた。
この方法として、例えば井上は、
各目盛りに形容詞とは別に数字を記す
ことを提案している。
また、使用する副詞についても、段階別に提案しており、
形容詞を定める際には、この文献に一度は目を通しておくべきであろう。
(原著(井上, 2002)はこのWebサイトで一般公開されています。)