Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
プロトコルの形式的安全性検証ツールProVerif / proverif
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Mako
August 09, 2021
Technology
1.4k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
プロトコルの形式的安全性検証ツールProVerif / proverif
seccamp2020 LT大会での発表内容
Mako
August 09, 2021
More Decks by Mako
See All by Mako
マイナンバーカードの暗号技術とセキュリティ
tex2e
2
3k
SELinuxで堅牢化する / selinux
tex2e
3
1.8k
TLS 1.3自作入門 / tls13
tex2e
0
1.3k
マイナンバーカードで署名する / mynumbercard
tex2e
2
3.5k
Other Decks in Technology
See All in Technology
SONiCのNETCONFサーバ機能を試してみた
sonic
0
100
AIチャット検索改善の3週間
kworkdev
PRO
2
160
Oracle AI Database@Google Cloud:サービス概要のご紹介
oracle4engineer
PRO
6
1.6k
サイバーエージェントにおけるAI推進戦略と変革への取り組み
shotatsuge
0
450
SteampipeとExcel Power QueryでAWS構成定義書の作成を自動化する
jhashimoto
0
170
iAEONの段階的リアーキテクト戦略 / iAEON's_Gradual_Re-architecture_Strategy
aeonpeople
0
250
AIネイティブな開発のサプライチェーンリスク対策 〜激動の開発現場でリスクに立ち向かう〜【ZennFes】
cscengineer
PRO
2
150
インシデントレスポンス演習 I / Incident Response Exercise I
ks91
PRO
0
110
データレイクの「見えない問題」を可視化する
sansantech
PRO
1
190
ザ・データベース、MySQL ~ OSC 2026 Sendai ~
sakaik
0
180
レガシーな広告配信システムでのAI駆動開発/運用の挑戦
i16fujimoto
0
110
スタートアップにAmazon EKSは早すぎる? マルチプロダクト戦略を加速する Platform Engineeringの実践 / Is Amazon EKS Too Soon for Startups? Practical Platform Engineering to Accelerate a Multi-Product Strategy
elmodev09
1
1.7k
Featured
See All Featured
Game over? The fight for quality and originality in the time of robots
wayneb77
1
200
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Raft: Consensus for Rubyists
vanstee
141
7.5k
A Tale of Four Properties
chriscoyier
163
24k
Why Our Code Smells
bkeepers
PRO
340
58k
Paper Plane
katiecoart
PRO
1
52k
The Invisible Side of Design
smashingmag
301
52k
Fireside Chat
paigeccino
42
4k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.3k
Designing Powerful Visuals for Engaging Learning
tmiket
1
420
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
260
Transcript
ϓϩτίϧͷܗࣜత҆શੑݕূπʔϧ ProVerif @tex2e
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ProVerif ֓ཁ • Ͱ͖Δ͜ͱɿ ϓϩτίϧΛϞσϧԽͨ͠ίʔυΛهड़ → ProVerif πʔϧͰ࣮ߦ → ੬ऑੑ͋Γɾͳ͠ͷఆ • Θ͔Δ͜ͱɿ ϓϩτίϧͷηΩϡϦςΟಛੑ ൿಗੑɺਅਖ਼ੑɺΦϑϥΠϯ߈ܸɺલํൿಗੑ • ࠓͷ͓ɿ αϯϓϧϓϩτίϧͰݕূ • ϓϩτίϧ α • ϓϩτίϧ β
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ProVerif • ϓϩτίϧ͕҆શ͔Ͳ͏͔ΛࣗಈͰূ໌ • ୭Ͱ͑ͯແྉ 1 • spi ܭࢉͷॻ͖ํʹ (গ͠) ࣅ͍ͯΔ • ݴޠͱͯ͠ OCaml ʹ (গ͠) ࣅ͍ͯΔ free c: channel. free message: bitstring [private]. query attacker(message). process out(c, message); 0 1 http://proverif.inria.fr/
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ϓϩτίϧ α Server Client ύεϫʔυ p, ฏจ m ύεϫʔυ p ҉߸Խ enc(m, p) ෮߸ ͜ͷϓϩτίϧ͕҆શ͔Ͳ͏͔Λ ProVerif Ͱݕূ͠·͢
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ϓϩτίϧͷϞσϧԽ ϋογϡؔ ಛɿ • Ұํؔ : f(m) → h • શͳ҉߸Ϟσϧ2ʹ͓͍ͯٯؔଘࡏ͠ͳ͍ ProVerif ͷίʔυ fun hash(bitstring): bitstring. 2 Dolve-Yao Ϟσϧ
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ϓϩτίϧͷϞσϧԽ ڞ௨ݤ҉߸ ಛɿ • ҉߸Խ : enc(m, k) • ෮߸ɹ : dec(c, k) • ҉߸Խͱ෮߸ͰݩʹΔ : dec(enc(m, k), k) = m ProVerif ͷίʔυ fun enc(bitstring , key): bitstring. reduc forall m: bitstring , k: key; dec(enc(m,k),k) = m.
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ϓϩτίϧ αͷϞσϧԽ ΫϥΠΞϯτ–αʔόؒͷ௨৴ (* Ϋ ϥ Π Ξ ϯ τ A *) let clientA() = event beginA(msg); out(c, enc(msg, password)); 0. (* α ʔ ό B *) let serverB() = in(c, x: bitstring); let recvmsg = dec(x, password) in event endB(recvmsg); 0. process ( (!clientA()) | (!serverB()) )
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ݕূํ๏ ൿಗੑ ݶΒΕͨਓ͔͠ใʹΞΫηεͰ͖ͳ͍͜ͱ • query : ݕূΫΤϦ • attacker(v) : ߈ܸऀม v ʹ౸ୡՄೳ͔ (* ൿ ಗ ੑ ͷ ݕ ূ *) query attacker(msg). query attacker(password).
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ݕূ݁Ռ ൿಗੑ $ proverif -color protocol1.pv ( {1}! {2}out(c, enc(msg,password)) ) | ( {3}! {4}in(c, x: bitstring); {5}let recvmsg: bitstring = dec(x,password) in 0 ) ... -------------------------------------------------------------- Verification summary: Query not attacker(msg[]) is true. Query not attacker(password[]) is true. ൿಗੑ → ͋Γ ✓ ΦϑϥΠϯ߈ܸ લํൿಗੑ
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ݕূํ๏ ΦϑϥΠϯ߈ܸ ౪ௌͨ͠༰ΛΦϑϥΠϯͰղಡ͢Δ͜ͱ • weaksecret v. ൿີ v ͷΤϯτϩϐʔ͕͍ͱ͖ 3ɺ ߈ܸऀม v ʹ౸ୡՄೳ͔ (* Φ ϑ ϥ Π ϯ ߈ ܸ ͷ ݕ ূ *) weaksecret password. 3ਓ͕֮ؒ͑ΒΕΔఔͷจࣈྻ͔͠ͳ͍ͱ͖ʢύεϫʔυͳͲʣ
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ݕূ݁Ռ ΦϑϥΠϯ߈ܸ $ proverif -color protocol1a.pv ... The attacker tests whether dec(~M,@weaksecretcst) is fail knowing ~M = enc(msg,password). This allows the attacker to know whether @weaksecretcst = password. A trace has been found. RESULT Weak secret password is false. ... -------------------------------------------------------------- Verification summary: Weak secret password is false.4 Query not attacker(msg[]) is true. Query not attacker(password[]) is true. ൿಗੑ → ͋Γ ✓ ΦϑϥΠϯ߈ܸ → Մೳ × લํൿಗੑ 4ऑ͍ൿີΛͬͨͱ͖ϓϩτίϧͷ҆શੑͳ͍ɺͱ͍͏ҙຯ
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ݕূ݁Ռ ΦϑϥΠϯ߈ܸ $ proverif -color protocol1a.pv ... The attacker tests whether dec(~M,@weaksecretcst) is fail knowing ~M = enc(msg,password). This allows the attacker to know whether @weaksecretcst = password. A trace has been found. RESULT Weak secret password is false. ... -------------------------------------------------------------- Verification summary: Weak secret password is false.4 Query not attacker(msg[]) is true. Query not attacker(password[]) is true. ൿಗੑ → ͋Γ ✓ ΦϑϥΠϯ߈ܸ → Մೳ × લํൿಗੑ 4ऑ͍ൿີΛͬͨͱ͖ϓϩτίϧͷ҆શੑͳ͍ɺͱ͍͏ҙຯ
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ݕূ݁Ռ ΦϑϥΠϯ߈ܸ A trace has been found. Honest Process Attacker ! ! Beginning of process clientA ~M = enc(msg,password) The attacker tests whether dec(~M,@weaksecretcst) is fail knowing ~M = enc(msg,password). This allows the attacker to know whether @weaksecretcst = password.
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ݕূํ๏ લํൿಗੑ ൿີݤ͕࿙Ӯͯ͠ɺաڈͷ҉߸Խ௨৴͕෮߸Ͱ͖ͳ͍͜ͱ • phase 1; out(c, password) Phase 0 : ύεϫʔυͰฏจ m Λ҉߸Խͯ͠ૹ৴ Phase 1 : ύεϫʔυΛ࿙Ӯͤ͞Δ ύεϫʔυ࿙Ӯޙʹ߈ܸऀฏจ m ʹ౸ୡՄೳ͔ (* લ ํ ൿ ಗ ੑ ͷ ݕ ূ *) process ( (!clientA()) | (!serverB()) | phase 1; out(c, password) )
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ݕূ݁Ռ લํൿಗੑ $ proverif -color protocol1b.pv ... ( {1}! {2}out(c, enc(msg,password)) ) | ( {3}! {4}in(c, x: bitstring); {5}let recvmsg: bitstring = dec(x,password) in 0 ) | ( {6}phase 1; {7}out(c, password) ) ... -------------------------------------------------------------- Verification summary: Query not attacker_p1(msg[]) is false. Query not attacker_p1(password[]) is false. ൿಗੑ → ͋Γ ✓ ΦϑϥΠϯ߈ܸ → Մೳ × લํൿಗੑ → ͳ͠ ×
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ݕূ݁Ռ લํൿಗੑ A trace has been found. Honest Process Attacker ! ! Beginning of process clientA ~M = enc(msg,password) Phase 1 ~M_1 = password The attacker has the message dec(~M,~M_1) = msg in phase 1
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ରࡦɾվળ ΦϑϥΠϯ߈ܸͱલํൿಗੑ • ΦϑϥΠϯ߈ܸɿ ऑ͍ݤ͔Βڧ͍ݤΛ࡞Δ • લํൿಗੑɿ ௨৴ຖʹҟͳΔڞ௨ݤΛ͏Α͏ʹ͢Δ
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ Diffie-Hellman ݤڞ༗ (DH) 1. Alice ཚ a Λબ͢Δ 2. Alice→Bob : A = ga (mod p) 3. Bob ཚ b Λબ͢Δ 4. Bob→Alice : B = gb (mod p) 5. Alice ͱ Bob ڞ௨ݤ K ͕ٻ·Δɿ K = (ga)b = gab = (gb)a (mod p) ੜݩ g ͱૉ p ΛదʹબͿͱ͖ɺ౪ௌऀެ։ A, B ͔Βڞ ༗ݤ K ΛٻΊΔ͜ͱࠔʢࢄରʣ
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ϓϩτίϧͷϞσϧԽ Diffie-Hellman ݤڞ༗ (DH ݤڞ༗) • Ұํ : A = ga (mod p) A = exp(g, a) • ެ։͔Βڞ௨ݤ͕ٻ·Δ : K = (ga)b = gab = (gb)a (mod p) K = exp(exp(g, a), b) = exp(exp(g, b), a) ProVerif ͷίʔυ type G. type exponent. const g: G [data]. (* ੜ ݩ g *) fun exp(G, exponent): G. equation forall a: exponent , b: exponent; exp(exp(g,a),b) = exp(exp(g,b),a).
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ϓϩτίϧ β DH ݤڞ༗ + ҉߸Խ Server Client ύεϫʔυ p, ฏจ m ύεϫʔυ p ੜݩ g = genG(p) ੜݩ g = genG(p) ga gb gab gab ڞ༗ݤ s = KDF(gba) ڞ༗ݤ s = KDF(gab) ҉߸Խ enc(m, s) ෮߸
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ϓϩτίϧ β DH ݤڞ༗ + ҉߸Խ Server Client ύεϫʔυ p, ฏจ m ύεϫʔυ p ੜݩ g = genG(p) ੜݩ g = genG(p) ga gb gab gab ڞ༗ݤ s = KDF(gba) ڞ༗ݤ s = KDF(gab) ҉߸Խ enc(m, s) ෮߸
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ϓϩτίϧ β ͷϞσϧԽ ΫϥΠΞϯτ–αʔόؒͷ௨৴ let clientA() = new randomA: exponent; let gA = exp(genG(password), randomA) in out(c, gA); in(c, gB: G); let sharedSecret = KDF(exp(gB, randomA)) in let ciphertext = enc(msg, sharedSecret) in out(c, ciphertext); 0. let serverB() = new randomB: exponent; let gB = exp(genG(password), randomB) in in(c, gA: G); out(c, gB); let sharedSecret = KDF(exp(gA, randomB)) in in(c, ciphertext: bitstring); let recvmsg = dec(ciphertext , sharedSecret) in 0. process ( (!clientA()) | (!serverB()) )
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ݕূํ๏ ൿಗੑɺΦϑϥΠϯ߈ܸɺલํൿಗੑ • attacker(v) ߈ܸऀม v ʹ౸ୡՄೳ͔ • weaksecret v. ൿີͷ v ͷΤϯτϩϐʔ͕͍ͱ͖ɺ ߈ܸऀม v ʹ౸ୡՄೳ͔ • phase 1; out(c, password) Phase 0 : ύεϫʔυͰฏจ m Λ҉߸Խͯ͠ૹ৴ Phase 1 : ύεϫʔυΛ࿙Ӯͤ͞Δ ύεϫʔυ࿙Ӯޙʹ߈ܸऀฏจ m ʹ౸ୡՄೳ͔
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ݕূ݁Ռ ൿಗੑɺΦϑϥΠϯ߈ܸ $ proverif -color protocol2a.pv ... -------------------------------------------------------------- Verification summary: Query not attacker(msg[]) is true. Query not attacker(password[]) is true. Weak secret password is true. ൿಗੑ → ͋Γ ✓ ΦϑϥΠϯ߈ܸ → ࠔ ✓ લํൿಗੑ
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ݕূ݁Ռ લํൿಗੑ $ proverif -color protocol2b.pv ... -------------------------------------------------------------- Verification summary: Query not attacker_p1(msg[]) is true. Query not attacker_p1(password[]) is false. ... ൿಗੑ → ͋Γ ✓ ΦϑϥΠϯ߈ܸ → ࠔ ✓ લํൿಗੑ → ͋Γ ✓
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ϓϩτίϧ β Wi-Fi ͷ৽ن֨ WPA3 Λࢀߟʹ࡞ Server Client ύεϫʔυ p, ฏจ m ύεϫʔυ p ੜݩ g = genG(p) ੜݩ g = genG(p) ga gb gab gab ڞ༗ݤ s = KDF(gba) ڞ༗ݤ s = KDF(gab) ҉߸Խ enc(m, s) ෮߸
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ͓ΘΓʹ • ProVerif ൿಗੑਅਖ਼ੑΛࣗಈͰݕূՄೳ • ͍ΖΜͳϓϩτίϧΛݕূͯ͠ΈΔͱָ͍͠ Happy ProVerifying!
ϓϩτίϧͷܗࣜత҆શੑݕূ ϓϩτίϧ α ϓϩτίϧ β ͓ΘΓʹ ࢀߟจݙ I Blanchet at el.: ProVerif 2.02pl1: Automatic Cryptographic Protocol Verifier, User Manual and Tutorial. INRIA, September 2020. Blanchet: ProVerif Automatic Cryptographic Protocol Verifier User Manual for Untyped Inputs. INRIA, September 2020.