3.4K Views
April 06, 23
スライド概要
セキュリティ・ミニキャンプ in 大阪 2023
セキュリティ・ミニキャンプ in 大阪 2023 インターネットを 安全にしたいんだオレたちは! セキュリティ・キャンプ協議会 代表理事 (株)セキュアスカイ・テクノロジー 取締役CTO はせがわようすけ
長谷川陽介 (はせがわようすけ) セキュリティ・キャンプ協議会代表理事 (株)セキュアスカイ・テクノロジー 取締役CTO 千葉大学 非常勤講師 OWASP Kansai ボードメンバー OWASP Japan ボードメンバー CODE BLUEカンファレンス レビューボードメ ンバー Internet Explorer、Mozilla FirefoxをはじめWebアプリケー ションに関する多数の脆弱性を発見。 Black Hat Japan 2008、韓国POC 2008、2010、OWASP AppSec APAC 2014他講演や記事執筆も多数。 https://utf-8.jp/ g(lwE@g'yK https://www.security-camp.or.jp/ #seccamp
プログラミングは好きですか? 新橋※のエンジニア25人に聞きました! いいえ はい まあまあ ※ Shimbashi Study Meeting の Slack にて g(lwE@g'yK https://www.security-camp.or.jp/ #seccamp
プログラミング、できると楽しいですよね
PHP
Go
<?PHP
echo "Hello, World";
?>
Python
print "Hello, World"
Java
public class Main {
public static void main(String[] args){
System.out.println("Hello, world");
}
}
g(lwE@g'yK
https://www.security-camp.or.jp/
package main
import "fmt"
func main() {
fmt.Printf("Hello World")
}
Rust
fn main() {
println!("Hello, world");
}
#seccamp
JavaScript
JavaScript
https://utf-8.jp/public/aaencode.html
゚ω゚ノ= /`m´)ノ ~┻━┻
//*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)=
(o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚
Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_')
[ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚
Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚)
- (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_']
=(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3)
+'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='¥¥'; (゚
Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='¥"';(゚Д゚) ['_'] ( (゚Д゚)
['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚)
+ (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o)
+(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) +
(゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o)
+(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) +
(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚
ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) +
(゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚
Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚
ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+
((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚
ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚
Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');
g(lwE@g'yK
https://www.security-camp.or.jp/
#seccamp
☺️プログラミングができると楽しい☺️ 楽しいだけでなく、ちょっとしたコードを書 くことができれば自分の作業の効率を大き く改善できる g(lwE@g'yK https://www.security-camp.or.jp/ #seccamp
学生時代 神戸市立高専 電子工学科 授業はロクに聞かず、ソー ラーカー作ったりしてた アルミ部材の切断、加工 ばっかりやってた 電子工学 is どこ g(lwE@g'yK https://www.security-camp.or.jp/ #seccamp
産業用電子回路の設計 (1997-2007年) 工場、発電所、製鉄所などで使わ れる制御機器の電子回路の設計 電源、センサー周辺、A/D変換、マイ コン周辺など 回路図の検証や部品リストの作成 などを自前のソフトウェアで自動 化し、自分の作業の効率を上げて いた ソフトウェア開発では戦えないけど、 武器のひとつとして他の分野で活か せる! g(lwE@g'yK https://www.security-camp.or.jp/ #seccamp
産業用電子機器の設計 悪環境での24時間365日の安定稼働 が当然のように求められる 温度変化、落雷、違法無線、電源変動など… ハードウェアだけでの対応はコストがか かるのでソフトウェアでできることを調 べる ソフトウェア製品は外部からの予期しな い入力に対してどのように挙動を安定 させているのかの調査へ g(lwE@g'yK https://www.security-camp.or.jp/ #seccamp
セキュリティコミュニティと つながる 安定稼働を脅かすバグ「脆弱性」 への興味 勉強会やメーリングリストなどのコ ミュニティ活動に積極的に参加 自分でも脆弱性を発見 特定ブラウザーの独自挙動に基づ きWebアプリに発生する脆弱性の 扱いの難解さ 「知っている人だけが知っている」 が、広く公表する危険性もあり悩ま しい セキュリティのコミュニティに何度も 相談 g(lwE@g'yK https://www.security-camp.or.jp/ #seccamp
セキュリティに貢献したい!! セキュリティには自分の知見を 活かせるところがたくさんあり そう 2008年にセキュリティのベン チャー企業に転職 特に当時の文字コード周辺技術 文字コードに関連する問題をセ キュリティと結びつけての研究は 自分以外に世界中でほぼ誰も 行っていなかった 自分がやらなければ埋没してい た(かもしれない) BlackHatで講演 g(lwE@g'yK https://www.security-camp.or.jp/ #seccamp
コミュニティに還元したい! 自分がセキュリティのコミュニ ティに育ててもらったので、自分 もコミュニティにきちんと返した い 会社や業務を超えて業界全体、 コミュニティ全体を盛り上げた い g(lwE@g'yK https://www.security-camp.or.jp/ #seccamp
ところで「脆弱性」って何? g(lwE@g'yK https://www.security-camp.or.jp/ #seccamp
「脆弱性」って何? 情報セキュリティ 情報の機密性・完全性・可用性を守ること 機密性 完全性 可用性 情報に関して、アクセスを 認められた者だけがこれ にアクセスできる状態を確 保すること 情報が破壊、改ざん又は消 去されていない状態を確 保すること 情報に関して、アクセスを 認められた者だけがこれ にアクセスできる状態を確 保すること 脆弱性 情報セキュリティの3要素を侵害する可能性のある製品の弱点のこと In general, a vulnerability is defined as a weakness in the computational logic (e.g., code) found in software and hardware components that, when exploited, results in a negative impact to confidentiality, integrity, OR availability. https://cve.mitre.org/cve/cna/CNA_Rules_v3.0.pdf g(lwE@g'yK https://www.security-camp.or.jp/ #seccamp
古典的な脆弱性
スタックベースのバッファオーバーフロー
C言語
void foo (char *user_input)
{
char buf[100];
strcpy(buf, user_input);
....
}
スタック上に確保されたバッファ領域を超えてデータが書き込まれること
で戻り番地などが上書きされ、攻撃者による任意コードの実行が可能に
なる
g(lwE@g'yK
https://www.security-camp.or.jp/
#seccamp
ライブラリなどによる対策 - 古典的な脆弱性
バッファサイズを明示的に指定することで、それ以上の書き込み
を防ぐ
C言語
char buf[100];
buf[sizeof(buf) - 1] = '¥0';
strncpy(buf, sizeof(buf) - 1, user_input);
Win32API
#include <strsafe.h>
...
StringCchCopy(buf, _countof(buf), user_input);
まだまだたくさんの注意点がある
ソース文字列はNULL終端されているか?
バッファサイズの指定は正しいか?
バッファが足りなかったときの挙動は?
バッファサイズは文字単位?バイト単位?
g(lwE@g'yK
https://www.security-camp.or.jp/
#seccamp
他のプログラミング言語を使うことによる改善
より抽象度の高いプログラミング言語を使用することで、バッファ
オーバーフローのようなプリミティブな脆弱性から解放される
PHP
<?php
$buf = "user input is" . $_GET["user_input"];
echo "<b>$buf</b>";
?>
例えばWebアプリでは、PHP / Java / JavaScript / Rubyな
どが広く利用される
大量の文字列処理やデータベースとの連携が行いやすい言語
動作の速さより開発の早さ
g(lwE@g'yK
https://www.security-camp.or.jp/
#seccamp
Webアプリケーションでの古典的な脆弱性 - XSS
クロスサイト・スクリプティング(XSS)
HTMLを生成する際に、攻撃者の指定した文字列がそのまま含まれるこ
とで発生する
意図しないHTMLタグやJavaScriptの挿入などが挿入される
攻撃者によって作成されたJavaScriptやHTMLタグが被害者のブラウ
ザー上で動作する
PHP
<!-- URLで指定された文字列を表示するPHPコード。XSSがある -->
<div>
Search result for: <?php echo $_GET['keyword']; ?>
</div>
https://example.jp/search?keyword=<script>...</script>
g(lwE@g'yK
https://www.security-camp.or.jp/
#seccamp
XSSに対するフレームワークでの対応
TwigやLaravelのbladeなど多くのテンプレートエンジンでは
HTML内への出力はデフォルトでエスケープされる
強く意識しなくてもXSSを防ぐことができる
PHP / blade
<!-- 「{{」「}}」囲まれた変数は自動でエスケープされる -->
<div>
result for: {{ keyword }}
</div>
g(lwE@g'yK
https://www.security-camp.or.jp/
#seccamp
Webアプリの古典的な脆弱性の例2 - DbXSS
素のJavaScript(Vanilla)での古典的なXSS
innerHTMLやinsertAdjacentHTMLへの文字列の代入でDOMbased XSSが発生
(もちろんこれ以外にもDOM-based XSSの発生原因は多数ある)
「外部からきた文字列をそのままHTMLとして取り扱ってはいけない」と
いうことを知識として知っておく必要がある
JavaScript
// 素のJavaScript. DOM-based XSSがある
const user_input = "<img src=# onerror=...>";
const target = document.getElementById("target");
target.innerHTML = user_input; // XSS
g(lwE@g'yK
https://www.security-camp.or.jp/
#seccamp
DbXSSに対する現代的な環境での対応1
ブラウザーの新しい機能としてSanitizer APIというXSSを防
ぐ機能が追加されている
明示的にSanitizer APIを利用しない限りは従来通りのDOM-based
XSSを作りこむ可能性がある
JavaScript
// Sanitizer APIによるDOM-baed XSSからの保護
const user_input = "<img src=# onerror=...>";
const sanitizer = new Sanitizer();
const target = document.getElementById("target");
target.setHTML(user_input, { sanitizer });
g(lwE@g'yK
https://www.security-camp.or.jp/
#seccamp
DbXSSに対する現代的な環境での対応2
Reactでは、DOM-based XSSの可能性がある任意のHTML
の設定には、開発者自身に危険性を意識させるため
dangerouslySetInnerHTMLという名前の機能を利用する
React
const createMarkup = () => {
return {__html: '<img src=# onerror=...>'};
}
return (
<div dangerouslySetInnerHTML={createMarkup()} />
);
g(lwE@g'yK
https://www.security-camp.or.jp/
#seccamp
脆弱性を生まないための開発環境の進化 開発者が脆弱性を作りこまないよう、開発環境や言語、ライブラリも改 良を重ねてきた 開発者が苦労しなくても脆弱性を防ぐことのできる様々なAPIの準備など それらの積み重ねられた対応策は、必ずしも自動的に適用されるもの ばかりではない 開発者が明示的に対策手段を選択しなくては依然として脆弱性が生まれるもの も多い セキュリティのためにコード記述方法を変化させるためのモチベーショ ンは低いかも(?) シンプルに記述できる、ストレスなく開発できる等という側面が強い セキュリティをモチベーションに言語やライブラリが設計されることは少ないか もしれない(とはいえTypeScriptなどバグを減らすためのモチベーションはあ る) 従来のコードとの互換性が求められる環境では急峻な変化は難しい g(lwE@g'yK https://www.security-camp.or.jp/ #seccamp
脆弱性を生まないための開発環境の進化 より複雑な脆弱性への対応はこれからの課題 局所的なコードの記述方法で防ぐことができる脆弱性はインジェクション 系などの単純なもののみ たとえば「特定の条件が重なったときだけ二重に割引される」のような、 仕様に基づく脆弱性は言語やライブラリでの解決は難しい そもそも仕様に関連した脆弱性については、対策として一般解を示すこと が難しく「十分に気を付ける」以外に答えのないものも多い g(lwE@g'yK https://www.security-camp.or.jp/ #seccamp
脆弱性低減に対する心理学、行動経済学的なアプローチ コードそのものが開発者(人間)と機械のUIであると考えると、ま だまだ改善の余地はありそう 視覚的な画面設計における危険性の排除は研究が積み重ねられている 例: 「エラーメッセージの頻出は注意力を低下させる」「赤色は危険を、緑 色は安全を示す」等 ReactのdangerouslySetInnerHTMLくらい危険性を明示できれば 開発者のミスを減らす効果がありそう 言語やライブラリの設計に対するナッジの導入 ナッジ = 意識せずとも行動変容を自然と促す仕組み メモリをバイト単位で操作できる仕組みと文字列型が共存している状況 はある意味ではナッジと言えるのかもしれない 心理学や行動経済学的なアプローチの普及はこれからに期待 g(lwE@g'yK https://www.security-camp.or.jp/ #seccamp
より抽象度の高い領域でのセキュリティ対策の必要性 「コード記述に起因する脆弱性」に限らず、セキュリティ全般の より広い範囲で行動経済学、社会心理学の応用が求められる 例:フィッシングメールやウイルスメール これらのメールは、利用者がうっかり開いてしまうよう攻撃者側は 行動経済学や社会心理学的な観点からも工夫を積み重ねている 一方で、対策は技術に偏重しており、人間に対しては「気を付ける」 のような曖昧としたものに終始している もっと、行動経済学や社会心理学等の観点からの対策があっ てもいいのではないか …みたいなところが最近の自分の関心領域 具体的にどうすればいい、みたいなのは持ってないけど。 g(lwE@g'yK https://www.security-camp.or.jp/ #seccamp
「正義のハッカー」って? g(lwE@g'yK https://www.security-camp.or.jp/ #seccamp
「正義のハッカー」って? 「正義のハッカー」「悪用厳禁」「法令順守」 セキュリティの取り組みへの注意書きとしてよく見かける表現 セキュリティにたずさわる人なら一度は見たこと、使ったことがあるはず ↓こういうやつ↓ 君も正義のハッカーに なってサイバー空間の 平和を守ろう! g(lwE@g'yK https://www.security-camp.or.jp/ 悪用厳禁! 学んだ技術は法を守って 活かしてください! #seccamp
「正義」「悪」ってなに? 正義とか悪とかって簡単に定義できるものではないはず 大昔から哲学のなかで議論され続けてきたテーマ 社会秩序を守ること? 法を守ること? 自分の信じる正しさを守ること? 安全性を高めること=正義? 能力のあるものが弱者の意思を無視してセキュリティ施策を押し付けることが 正義なのか 情報セキュリティにおいてパターナリズムの観点での議論は少なそう 法を守ること=正義? 海外では「国家の情報活動に協力する義務がある」といった旨の法律が定められ ているところもある そういった法のもとでは、国からの指示があれば利用者の情報を提出すること や他国のサービスを攻撃することも法に従った「正義」になるのか g(lwE@g'yK https://www.security-camp.or.jp/ #seccamp
答えが出るものではない 普遍的・絶対的な価値観、法律、社会的状況などによって常に影響 を受ける 何が正義なのか、何が悪なのかの答えはたぶんない 考えることで一時的な答えが出るかもしれないが、一時的なものでしかな い 学んだからといって習得・定着するものではない だからこそ、常に考え続けなければいけない 自分の価値観だけで決まるものではないからこそ、社会や周囲に関心を 持ち続ける必要がある g(lwE@g'yK https://www.security-camp.or.jp/ #seccamp
まとめ g(lwE@g'yK https://www.security-camp.or.jp/ #seccamp
今日話したかったこと 抽象度の高いセキュリティへのより効果的な対応が求められる プリミティブな脆弱性への対応は開発環境の進化とともになされてきた より抽象度の高い脆弱性への対応はまだまだ「人間が気を付ける」必要が ある そういった「人間が気を付ける」をより効果的に行うために社会心理学や 行動経済学が応用できる可能性がありそう セキュリティにおける「正義」「悪」に簡単な答えはない 学んだからといって習得できるものではなく、自分で決められるものでも ない 社会に関心を向けながら継続的に考え続ける必要がある g(lwE@g'yK https://www.security-camp.or.jp/ #seccamp
ご質問・お問い合わせ @hasegawayosuke セキュリティ・キャンプ g(lwE@g'yK https://www.security-camp.or.jp/ 検索 #seccamp