ハッシュ関数について(前編)
はじめに
seccamp2021のグループKのリレーブログの一貫です。
前回はこちら。次回はこちら。
このリレーブログについて、グループとして発表することになりました(宣伝)
他の内容も面白そう
今回のお題はハッシュです。
ハッシュ関数(ハッシュ)とは
任意長のビット列から規則性のない固定長のビット列を生成する関数です。
理想的なハッシュ関数は次の特性を備えます。
- 同じ引数なら返り値も同じ
- 不可逆性
- 高速計算
- コリジョン(衝突)が少ない
2と4について少し深堀をしていきます。
不可逆性
不可逆性とは、ある状態から変化させることはできるが変化後の状態から元の状態に戻せないことを言います。
ハッシュ関数では上記のように固定長のビットに圧縮または拡張?しますし、規則性がないので復元することができません。例として余りを考えてみます。
余りを用いるというのも一種のハッシュ関数です(多分)。
この結果は4ですね。ここで復元することを考えてみましょう。しかし、5で割ったときに余りが4になる数字なんていっぱいあります。そこから9を当てるのなんて難しい話です。これが不可逆性です。
なので、ハッシュ関数は暗号化ではありません。暗号は復号(復元)することが出来ます。
コリジョン(衝突)が少ない
衝突とは、違う引数をハッシュ関数に通した際に結果が同じになることです。先程のコードの例だと、[4, 9, 14]は同じ返り値になります。
これがなぜ少ない方が良いかは用途を例に上げると分かりやすいかもしれません。
例えばハッシュ関数は、改ざんを検知するために使われます。イメージファイルなどをダウンロードする時、ダウンロード後サイトに記載されたハッシュ値と比較することがあると思います。衝突しやすい場合、ダウンロードファイルがもとのファイルと異なっていても同じハッシュ値になってしまうわけです。これでは正しいかチェックした意味がありません。
次に少し触れましたがハッシュ関数の用途を考えてみます。
用途
- 検索の高速化
- 改ざんの検出
2に関しては先程触れたので、1について。ただ、少し自分の解釈も混じって書くので間違った内容もあるかもしれません。
ハッシュ探索という探索アルゴリズムがあります。基本的に計算量はO(1)です。
原理は、データを登録したい時にそのデータをハッシュ関数に渡してハッシュ値を求めます。そのハッシュ値はハッシュ表の位置になります。その位置にデータを登録します。
ハッシュ表は配列みたいなものでハッシュ値が配列のインデックスです。
探索するときは、そのデータのハッシュ値を求めてあげると格納位置が一意に決まります。
ただし、先程説明した衝突が起きるといろいろ問題が起きます。解決法は今はいいでしょう。
みなさんも聞いたことがあるであろうsha256について書いていきます。
sha256
sha256はSecure Hash Algorithm 256-bitの略です。
まずは、ハッシュ値を得るまでの流れを箇条書きで
- sha256には初期ハッシュ値というものがある
- データを64bitずつに分割する -> メッセージブロック
- 初期ハッシュ値とメッセージブロックを使ってハッシュ値を生成
-> このハッシュ値を使って次のメッセージブロックと...を繰り返す
これを図で。
このメッセージブロックに分割するさいですが、全ての入力データが64✕n bitではありませんので調整をするためにパディングを行います。
パディング
パディングは0で埋めるイメージだったんですが、これをしてしまうと元のデータで使用されている0と区別がつかなくなります。sha256では次のようなルールでパディングしているようです。
- 元のメッセージと調整のメッセージの区切りは0x80で行う
- メッセージブロックの最後には元のメッセージの長さ(bit数)を入れる
- 0x80とこの情報の間を0で埋める
以上です。
参考資料
鍵交換、DH法について
はじめに
seccamp2021のグループKのリレーブログの一貫です。
前回はこちら。次回はこちら。
今回のお題は鍵交換になります。間違っている情報があるかもしれません。教えていただけると嬉しいです。
鍵配送問題
初めての通信時(鍵配送時)にセキュリティ確保された通信経路がありません。この状態で鍵配送をすると盗聴される可能性があります。これが鍵配送問題です。
もう少し分かりやすい例だと、盗聴されている状態で暗号化されたファイル(zip)と鍵を別々にしても意味がないという感じです。
この鍵配送問題を解決するのが、鍵交換、鍵交換アルゴリズムになります。
鍵交換アルゴリズム
2大アルゴリズムとして、Diffie-Hellman(DH)方式とRivest-Shamir-Adleman(RSA)方式があります。RSA暗号(公開鍵暗号を指す)はこのRSA方式の狭義のよう。
現在はRSA暗号は鍵交換のためには用いられていません。
DH法について
DH法で用いられる数学的・暗号的な話しは離散対数問題です。数学が詳しいわけでもないので具体的な証明などは省きます。DH法はあくまで鍵交換のためのアルゴリズムで暗号化をすることはできますが、一般的に想像するデータの暗号化とは違います。
その上で、DH法はAES(共通鍵暗号方式)の鍵交換に使われることが多いです。
次に、DH法のステップを言葉と図で説明します。
1. 公開鍵 x、pの決定
2. 秘密鍵A、Bの決定(2< A, B < p)
3. 秘密鍵、公開鍵から作った情報を送る
4. 貰った情報を自身の秘密鍵で計算を行う
-> この時復号データが二者間で一致する -> これを共通鍵にする
勝手な解釈ですが、このように共通鍵ができるからAESに適しているんですかね。
最後に、最近の話。
近年はDH法での暗号方式が計算できるようになってきているらしい。そこでその進化版である楕円曲線離散対数問題 : ECDH法を使うようになっているぽいです。
過去の脆弱性
自分が見つけた鍵交換に関する脆弱性は次の通りです。
・Freak 攻撃
・Logjam 攻撃
この2つは暗号方式による脆弱性ではなくて(DH法が計算される話はおいておいて)、SSL/TLSにおける実装上・使用上によるものでした。
どちらもbit数を下げることで、暗号強度を下げ解読を可能にするものでした。
参考文献
DH法の証明とかはここがよさそうでした。
ハードウェアトロイについて
はじめに
seccamp2021のグループKのリレーブログの一貫です。
前回はこちら。次回はこちら。
グループとしても、自分としても今年最後の執筆になります。
なかなかこの企画は楽しいので、来年も続けていきたいです。
さて今回のお題は「ハードウェアトロイ」です。
トロイの木馬(Trojan Horse)とは
マルウェアなどで使われるトロイの木馬は正規のソフトウェアやファイルになりすまして攻撃を仕掛けるマルウェアを指す。つまり、トロイの木馬というのはマルウェアの種類です。
最近あった事例(自分が見たやつ)ではこんなものが。
怖いですね
ハードウェアトロイとは
ハードウェア(半導体チップ等)の回路を変更したり、本来の機能では使用しない回路を組み込むことで不正な活動ができるようになります。(単純な例を下に示します
不正活動は次のようなものがあります
- 動作改変 (回路の異常でバグが起きる
- ネットワークの不通、システム停止
- 発信源としてウイルスの広がりが起きる
この2つの例ですと、製造時のテストで発見されてしまいますが実際は単純なテストでは見つからないようになっています。例だと、論理値が変わってきますがトロイではレアケースを除けば論理値が変わりません。このようにハードウェアトロイのトリガーとなるレアなテストケースを見つけるのが難しいので検知も難しいわけです。
悪さをするタイミング
次に、いつ仕込まれるのかという話です。回路ができる流れは次のようになります。(あくまで1つの例です)
図だと、悪さができるのは次の2つです。
- 回路のデザインを行うとき
- 回路の実装をするとき
1は内部による犯行なのである程度どうにかできるかもしれませんが、2は外部委託とかによって生じるものなのでいろんな問題が絡んできます。
そういった部分は会社同士で提携とか結んで防いでいるみたいです。
検知
調べて見つけた検知手法を3つ挙げたいと思います。
- 目で見つける
- 結果が出てくるまでの遅延で比べる(サイドチャネル攻撃も含める
- 回路構造の解析
1はものによってはできるかもしれないですが、多分論外でしょう。2はかなり差が現れるみたいです。3を使う、実際のツールとしてはHTfinderというものがあります。
パターンごとに重み付をしているようで、最終的に得点が高いとフラグを建てるみたいな感じ。誤検知をなくす取り組みもこの重み付にあるみたいです。
また、人工知能による未知の脅威を検知する取り組みも行われているようです。
データベースのセキュリティ
最初のメモ
seccamp2021のグループKのリレーブログの一貫です。
前回はこちら。次回はこちら。
与えられたテーマはデータベースのセキュリティです。
はい。データベースと言えばSQLがすっと思い浮かびますが特に触ってきてないので全く分かりません。やばい
誤植あれば教えて下さい。
DB導入編
データベースの定義
データベースとは、構造化した情報またはデータの組織的な集合であり、通常はコンピューター・システムに電子的に格納されています。データベースは通常、データベース管理システム(DBMS)で制御します。データとDBMS、およびそれらに関連するアプリケーションをまとめてデータベース・システムと呼びます。多くの場合は単にデータベースと呼んでいます。
引用元 : データベースとは | Oracle 日本
このデータベースを操作・構成するために用いられる言語の1つがSQLです。
次にデータベースの種類です。
1. 階層型
木構造のようなデータ構造を取る。ただし、子が親を複数持ちたい場合、重複登録をする。また、データの変更でルートを再登録する必要がある。
・検索が早い
・柔軟性、操作性に欠ける
2. ネットワーク型
グラフなので、階層型のような重複登録はない。
・重複登録を避けれる
・柔軟性に欠ける
3. リレーショナル
Excelのような表でデータを持つ。
・データの取扱が簡単
・処理速度の遅延(プログラムの複雑さが原因)
3-1. RDBMS
SQLを利用してリレーショナルデータベースを管理するシステムのことを指す。
・SQLによる操作なので、データの取扱が容易になる
・変更がすっとできない
3-2. NoSQL
SQLを利用しないでリレーショナルデータベースを管理する。
・RDBMSよりパフォーマンスがよい
・データの整合性、編集に難あり
RDBMSのセキュリティ
SQLインジェクションを防ぐというのがRDBMSのセキュリティとなります。
SQLインジェクションが発生する流れは次の通りです。
Webアプリでデータを取得するためのフォームがある。このフォームを通して、データにアクセスする。
入力された値はSELECTに入って、データベースと照合される。データが見つかればアクセスが許可され、見つからなかったら拒否される。
次に正常なデータへのアクセスとSQLインジェクションの2つについて示します。
DBは学籍番号と名前、学校のパスワードがあるとします。フォームにパスワードを打つことでマッチしたデータを出力してもらえます。
図1 データベースの中身
・通常の入力
inputにhoge_passが入るとデータベースのpasswordにマッチするので機会太郎のデータが見れます。
inputにhoge_piyoが入るとデータベースのpasswordにマッチしないので何も見れないです。
よくある' or 1=1 --を例に挙げます。
' : 前の'と対になっています。()みたいな感じ。文字列定数を終わらせる
or : ' 'か1=1が真の時、真となる
1=1 : いつでも真(多分真じゃないって言う人はいないよね)
-- : これ以降を無視する
なのでor 1=1だけでもSQLの構造によって書き方を変える必要がある。これを入力すると常に真なので全員の情報を見ることができます。
攻撃完了ですね。
SQLインジェクションを防ぐためには次のような対策が挙げられます。
1. エスケープする
エスケープとは特別な意味を持つ文字・記号を置換すること。例えば先程の=や'を全てASCIIの値に変換するとか、Unicodeにするとか。これで式自体は成り立たなくなる。
2. WAF
SQLインジェクションが成功してしまっても、不正なアクセス方法であれば、データを返さない。
ただ、現状としてSQLインジェクションの対策は後手になっているようです。
NoSQLのセキュリティ
SQLインジェクションはなくなったもののWebアプリケーション側に脆弱なプログラムがあり、インジェクションが発生することがある。ある程度理解して記事にまとめたかったが時間が足りないので今回は記事を貼ることで代用します。
他にも良い記事いっぱいあると思います。
最後に
難しい。IoTとデータベースのセキュリティの話もあったからあとでもう少し詳しく調べてみたいです。雑なまとめで申し訳ありません。
Winja CTF
Winja CTFに参加した
チームBigdrea6、メンバーBigdrea6+dddで参加した。
100点を3つ通したのみ。今回も雑魚でした。
何位か見ようとしたらサーバー落ちてた。
問題名もわからん
belive steganograhy(100pt)
フォルダ名がこれだったのでこのまま引用。
写真が配布される。exiftoolで見るとflagが分割して入っていた。
結合
flag : flag{849d97fa58871dad45e81027f861739_maYB3_i_SHOULd_BELIeve-7HeM}
decode crypto(100pt)
webサイトにエンコードされたflagがある。一部見切れていたので、詳細表示のnetworkでうまいこと見た。base64で復号
flag : flag{f4dk3gkx4fb81df0aw4v_bAs364_is_Aw3s0m3}
circle cipher crypto(100pt)
円がたくさんの写真。調べたら出てきた。
Circular Glyph Cipher Puzzle (Delirium Games) : puzzles
手作業で復号。
flag : flag{6B96EE99EE165EC57B8978ED1FF74601_BORG_AND_BYNAR_5CRIPT5}
うーむ。復習して精進します。
Synack Red Team Five CTF
Synack Red Team Five CTFに参加しました
Hack The Box上で開催されたCTFです。HTBってマシンをどうちゃらこうちゃらするやつだったのに最近見たらめっちゃ変わっててびっくりした。
あと、運営の方?の呼び込みがすごかった。明らかに海外の方なのに日本語流暢すぎて、詐欺というかそっち系かと思ったw
チームBigdrea6、メンバーBigdrea6ということで、4問解いて192位でした。
多分、日本勢最下位取ったんじゃないでしょうか。
いろんなイベント重なっていて半日くらいしかやってないけど楽しかったです。
Check rev(225pt/154solved)
elf形式でした。実行すると文字列を受け取って何かと比較しているようです。
ltraceで見てみます。ビンゴです。
flag : HTB{ch3ck_anD_r3checK_aga1n!}
Sneaky forensic(200pt/219solved)
pcapが渡されます。tcpストリームを眺めていると、ログインが成功したときのpasswordが記録されています。これがflagです。
flag : HTB{not_an_easy_password_to_guess}
Phishinlmpossible forensic(400pt/164solved)
pdfが渡されます。とりあえず、pptxに直しましたが何も隠れていませんでした。
binwalkするとascii textがあります。取り出しましょう。
$ binwalk -D=".*" <対象pdf>
$ cd <対象pdfのbinwalk結果ディレクトリ>
txtファイルの中身は多分、cmd.exeに投げるシェルスクリプトみたなもの?(適当言ってます。)
言語とかはどうでもよくて、ここに分割されたflagがあります。つなげましょう。
flag : HTB{th1s_m3sS@gE_w1ll_s3lf_d3StRuC7}
Blobber misc(225pt/160solved)
message.jsが配布されます。中身はひどく難読化されています。まずはjsの見栄えの難読化を解きました。
見やすい。なんとなくですが、asciiコードに変換されている文字列があるようです。
pythonで修復しました。すると、pdfのバイナリであることが分かりこれを実際にファイルに直します。コードを書くのがめんどくさくて、cyberchefに投げてファイルにしてダウンロードしました。flagゲットです。
flag : HTB{l00k_cL0s3r_y0u_m1gHt_f1nd_0bfUsc4t10n_in_pl41n_sIgHT}
最後に
いや、雑魚すぎるwriteupですね。お恥ずかしい。いい訳すると惜しい問題はたくさんありましたが、時間がなさすぎました。さっと解けるように精進したいと思います。
あと心配事があって。このCTFってwriteupいいよって言ってましたっけ?NGだったような...
ゼロトラストネットワークについてまとめた
はじめに
seccampのグループワークの活動、リレーブログで書いている記事です。
お前はLTだろという声が聞こえてきそう。誘っていただき参加することにしました。
前回のブログはこちら。
次のブログはこちら。
テーマを前の人からもらってブログを書きます。
今回のテーマは"ゼロトラストネットワーク"です。
ゼロトラスト?ネットワーク??って感じの初学者ですが、初学者なりに調べてまとめていきたいと思います。
ゼロトラストとは
ゼロトラストネットワークを語る前にこれについて解決しなければいけません。
zero trust、直訳で信頼(信用)0。つまりは「何も信頼しない」を前提に対策を講じるセキュリティの考え方。
2010年にForrester Research社の調査員によって提唱されました。しかし、このときはふわふわした概念になっていました。
2020年、NISTがSP800-207(ゼロトラスト・アーキテクチャ)で「ゼロトラスト」を実現するために必要な7つの理念を公開しました。これによってふわふわ感はほぼ解消された訳です。今回はゼロトラストネットワークなため、これら1つ1つについて書くことはしませんが7つの要件と4つのソリューションという内容を引用したいと思います。
ゼロトラストネットワークについて
いよいよ本題です。ここでは従来との差、メリット・デメリットについてまとめたいと思います。
・従来との差
従来は信頼できる"内"と"外"でネットワークを分けて考えていました。具体的な例をあげると"内"は社内ネットワークになり、"外"は外部サイトから送られてくる情報になります。また、この内外の考え方から"内"は絶対に安全と定めることができます。なぜなら、"内"と"外"をつなぐ境界線では通信の監視や制御を行うからです。ここでの監視や制御はファイアーウォールなどになります。
改めて、従来のネットワークを構成する者たちをまとめます。
・内 : 社内LAN、データセンター
・外 : インターネット
・境界線 : ファイアーウォール
外は危険!内に入れるときは厳重に検査するよ!
近年はこの"内"と"外"の概念があいまいになりつつあります。
例えば、学校でしかアクセスできないサイトがあればそれはもうじれったいですよね。しかし最近そのようなサイトやデータはないはずです。IDやパスを入力して、なんならそれなしで見れたり触ったりできるはずです。
このように境界線が定められなくなったことからどこをどれを監視・検査すればいいか分からなくなったのです。これを解消するためにゼロトラストを用います。
全て信用しないのですから、全ての端末の全てのログを取ればいい訳です。そして検査を行います。これがゼロトラストネットワークです。
守るものは当然、データやそれを利用するユーザや端末です
みんな信じれない!アクセスするものは全員検査するよ!
・メリット・デメリット
メリットとしては境界が曖昧な環境では絶対に力を発揮すること。ファイアーウォールやセキュリティ対策ソフトでは守れない部分を補うわけなので。
デメリットとしては結果として信頼したというバッジを得たユーザー・端末もしくはファイルが必ずしも信頼できない、正しいとは言えないことです。外から内に入ることを許したとしてもみんな信じてはいけないので。なので厳しいアクセス制限などが一度信頼されたユーザーにも発生します。このようにアクセス制限での利便性低下が発生することがデメリットに該当します。
こちらもまとめ直すと
・メリット
- 境界がどれだけ曖昧でも力を発揮する
・デメリット
- 信頼したものは完全に信頼したわけではない(残存リスク)
- アクセス制限での利便性低下
さいごに
ゼロトラストからゼロトラストネットワークの考え、メリット・デメリットについてまとめてみましたが、いかがでしたでしょうか。今回初めて学びましたが全てを信頼しないという孤独の強さを知りました。
余談になりますが、このような記事を今日読みました。これもゼロトラストの考え方に基づいていますかね?
記事に間違いなどを発見した方は連絡していただけると嬉しいです。
ほんとの最後に参考資料をまとめさせていただきます。
・ゼロトラストネットワークとは?【2021年版】
・ゼロトラストネットワークとは?仕組みやメリットデメリットについて徹底解説|サイバーセキュリティ.com
・ゼロトラストとは?意味・定義 | ITトレンド用語 | NTTコミュニケーションズ
・ゼロトラスト・セキュリティとは?|情報セキュリティのNRIセキュア