Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
プロトコルの形式的安全性検証ツールProVerif / proverif
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Mako
August 09, 2021
Technology
1.5k
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
3.3k
SELinuxで堅牢化する / selinux
tex2e
3
1.9k
TLS 1.3自作入門 / tls13
tex2e
0
1.3k
マイナンバーカードで署名する / mynumbercard
tex2e
2
3.6k
Other Decks in Technology
See All in Technology
PostgreSQL at Microsoft: Open Source, AI, & Cloud | Claire Giordano | PGConf.EU 2026
clairegiordano
0
110
ドメインエキスパートは いかにして AI を使って プロダクト開発をするか
tatsuyashiraishi
1
220
クラウドサインを止めずに Nuxt へ 次の10年のために先に決めたこと
bengo4com
1
170
Jev の中身は50行で再現できる。でも本物との差はどこにあるのか
hisuzuya
0
120
1週間、Opus封印でお願いします
kintotechdev
0
340
Let's Change Our World—Again
snoozer05
PRO
6
710
200人の配信コメント、 全部Jevが仕分けます 〜 マサカリガードを作ってみた 〜
katayamatg
1
360
Snowflake でできることが増えたら、 ABAC が必要になった
kaeton
0
110
AI時代のエンジニアの情報発信〜個人の発信を組織の力に変える〜
ryo_kawamata
0
220
OneLakeをデータソースにした AI Search(Foundry IQ)の ライフサイクル管理
ryuseiiida
0
130
自宅サーバと脆弱性
masakiokuda
1
120
正解のない研修に放り出されて / Being thrown into a training program with no right answers
ohnoeight
1
160
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3.1k
Speed Design
sergeychernyshev
33
2.2k
Thoughts on Productivity
jonyablonski
76
5.4k
Facilitating Awesome Meetings
lara
57
7.2k
We Have a Design System, Now What?
morganepeng
55
8.4k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
740
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
The Curse of the Amulet
leimatthew05
3
16k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Scaling GitHub
holman
464
140k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
770
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.