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
負ける気せえへん HTML5セキュリティやし#OWASP Kansai Local Chapt...
Search
OWASP Japan
June 06, 2014
230
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
負ける気せえへん HTML5セキュリティやし#OWASP Kansai Local Chapter Meeting 2nd
OWASP Japan
June 06, 2014
More Decks by OWASP Japan
See All by OWASP Japan
OWASP Night 2019.03 Tokyo
owaspjapan
0
410
OWASP SAMMを活用したセキュア開発の推進
owaspjapan
0
1.1k
20190107_AbuseCaseCheatSheet
owaspjapan
0
220
セキュリティ要求定義で使える非機能要求グレードとASVS
owaspjapan
5
1.2k
AWSクラスタに捧ぐウェブを衛っていく方法論と死なない程度の修羅場の価値
owaspjapan
9
3.5k
Shifting Left Like a Boss
owaspjapan
2
350
OWASP Top 10 and Your Web Apps
owaspjapan
2
440
OWASP Japan Proposal: Encouraging Japanese Translation
owaspjapan
1
300
elegance_of_OWASP_Top10_2017
owaspjapan
2
580
Featured
See All Featured
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
890
GitHub's CSS Performance
jonrohan
1033
470k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.5k
Producing Creativity
orderedlist
PRO
348
40k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Documentation Writing (for coders)
carmenintech
77
5.4k
Music & Morning Musume
bryan
47
7.3k
Leo the Paperboy
mayatellez
8
2.1k
Transcript
ෛ͚Δ͖ͤ͐Μ ݩ͠ HTML5ηΩϡϦςΟ (ެ։൛) Yoshinori Matsumoto OWASP
Kansai Local Chapter Meeting 2nd 2014/06/06
ࠓͷ༰ • HTML5ηΩϡϦςΟͰͷٕज़ ͱͦͷղઆ ͦͷͳ͔͔Βදతͳͷ2ϐοΫΞο ϓ –XMLHttpRequestͱCORS
–Content-‐Security-‐Policy
ָউ ෛ͚Δ͖ͤ͐Μ ΫϩευϝΠϯ͠ͷר
XMLHttpRequestͱ • XMLHttpRequestͬͯͳΜ͚ͩͬʁ –JavaScriptΛ༻ͯ͠αʔόͱHTTP௨ ৴Λߦ͏API –WebαΠτͷඇಉظॲཧͳͲͰΑ ͘༻͞ΕΔ
ैདྷͷXMLHttpRequest 通常の場合 var url = “kobe.html”; var xhr
= new XMLHttpRequest(); xhr.open( "GET", url, true ); xhr.onreadystatechange = function(){ if( xhr.readyState == 4 && xhr.status == 200 ) { div.innerHTML = xhr.responseText; } kobe.html <div>
ैདྷͷXMLHttpRequest jQueryの場合 var url = “kobe.html”; $.get(url, nulll,
function(data){ $(“#elemID”).html(data); }); kobe.html <div>
ैདྷͷXHRͷҙ • XSS ( Cross-‐Site-‐Scripting ) – ͜ͷ࣌ɺJavaScriptؚ͕·ΕΔͱ࣮ߦ͞Εͯ͠·͏߹͕͋ Δ
– XHR ͳͲͰ DOM ૢ࡞࣌ʹൃੜ͢Δ XSS DOM based XSSͱ ݺΕ͓ͯΓɺJavaScriptΛଟ༻͢ΔαΠτͰ࡞ΓࠐΈ͍҆ – ಛʹୈࡾऀͷೖྗΛग़ྗ͢Δ໘ʹ͓͍ͯൃੜ͢Δ͜ͱ ͕ଟ͍ some_text <div> SCRIPT <div>
ैདྷͷXHRͷҙ 通常の場合 var url = “kobe.html”; var xhr
= new XMLHttpRequest(); xhr.open( "GET", url, true ); xhr.onreadystatechange = function(){ if( xhr.readyState == 4 && xhr.status == 200 ) { div.innerHTML = xhr.responseText; } SCRIPT <div>
ैདྷͷXHRͷҙʙରࡦʙ • HTMLੜ࣌ͷΤεέʔϓ –͜ͷΑ͏ͳXSSΛରࡦ͢ΔʹHTMLͱͯ͠ҙຯΛ ͭه߸ͳͲͷจࣈΛΤεέʔϓ͢Δ͜ͱ͕ඞཁ • (e.g.
ʮ<ʯ →ʮ<ʯɺʮ”ʯ→ʮ"ʯ) • DOMܦ༝Ͱૢ࡞͢Δ –JavaScriptͰૢ࡞͍ͯ͠Δ߹ɺςΩετϊʔ υΛੜͯ͠DOMܦ༝͢Δํ͕ཏతʹXSS߈ܸ ͷൃੜΛ͙͜ͱ͕Ͱ͖Δ
XSSʹҙ ʙରࡦʙ 通常の場合 var xhr = new XMLHttpRequest(); xhr.open("GET",
url, true); xhr.onreadystatechange = function(){ if(xhr.readyState == 4 && xhr.status == 200){ var result = document.getElementById("result"); var text = document.createTextNode( xhr.response ); result.appendChild(text); }
XSSʹҙ ʙରࡦʙ jQueryの場合 $.get(url, null, function(data){ $("#result").text(data);
});
HTML5ͰͲ͏มΘͬͨͷ͔ʁ • ࠷ۙͷϒϥβͰ –XHR Level2 ͷαϙʔτͳͲʹΑΓɺ ଟ͘ͷϒϥβͰػೳ͕Ճ͞Εͨ –ͬ͘͟Γݴ͏ͱ…
• ࠓ·ͰɿηΩϡϦςΟͷ໘Ͱಉ͡αΠ τͰ͔͠௨৴Ͱ͖ͳ͍ • ࠷ۙ : αΠτΛ͑ͯ௨৴Մೳʹʂ
SOP • SOP : Same-‐Origin-‐Policy –XMLHttpRequest͕༻Ͱ͖Δͷɺૹ৴ݩ ͱૹ৴ઌͷΦϦδϯ͕ಉҰͷ߹ͷΈ –ηΩϡϦςΟͷ؍ͳͲ͔ΒɺΦϦδϯΛ
͑ͨ௨৴Ͱ͖ͳ͍ ΦϦδϯͱ… ίϯςϯπͷಡΈࠐΈݩͷεΩʔϜɾϗετɾϙʔτͷ3छྨͷ Έ߹Θͤ http://example.com:80
CORS • CORS : Cross Origin Resource Sharing –ΦϦδϯΛ͑ͨ௨৴͕Մೳ
–ϦΫΤετΛड͚Δαʔόଆ͕ΫϩεΦϦ δϯ௨৴Λड͚ೖΕΔઃఆʹ͍ͯͨ͠߹ ίϯςϯπΛड͚औΔ͜ͱ͕Ͱ͖Δ ίϯςϯπ ҟͳΔΦϦδϯ ͷαʔό ΦϦδϯ ___Ͱ͢ ΞΫηεͰ͖ΔΦϦδϯ ___Ͱ͢
CORSͷରԠঢ়گ ʮCan I use …ʯ͔ΒͷҾ༻Ͱ࣮ࡍࢼ͍ͯ͠·ͤΜ http://caniuse.com/
CORSͷରԠঢ়گ • IE8,9ಠ࣮ࣗͰ͢ʢXDomainRequest) υϝΠϯؒཁٻ (XDR) ͷ֓ཁ" http://msdn.microsoft.com/ja-‐jp/library/dd573303%28v=vs.85%29.aspx
CORS • ΫϩεΦϦδϯ௨৴ͷྲྀΕ 1. ௨ৗͱಉ͡Α͏ʹXMLHttpRequest௨৴Λߦ͏ JavaScriptΛهड़͢Δ 2. ϒϥβ͕ίϯςϯπͷϦΫΤετʹΦϦδ
ϯ(Origin) ϔομΛՃ͢Δ 3. ΞΫηεઌͷαʔό͕Ϩεϙϯεϔομʹڐ Մ͢ΔΦϦδϯΛ͚ͭͯฦ͢ 4. ڐՄ͢ΔΦϦδϯʹؚ·Ε͍ͯΔͱJavaScript ͔ΒΞΫηε͢Δ͜ͱ͕ՄೳʹͳΔ
CORS • HTTP௨৴(ൈਮ) GET /xhr_api.php HTTP/1.1 Host: server2.owaspkansai.test
Origin: http://server1.owaspkansai.test Referer: http://server1.owaspkansai.test/xhr_normal.php HTTP/1.1 200 OK Date: Wed, 04 Jun 2014 09:13:08 GMT Server: Apache Access-‐Control-‐Allow-‐Origin: http://server1.owaspkansai.test Content-‐Type: text/html " "
CORSͷҙ ͦͷ1/3 • ػີใͷΞΫηε੍ݶʹ͜ͷػೳΛ ͏͜ͱͰ͖ͳ͍ –͜ͷػೳɺXMLHttpRequest͔Βͷ ΞΫηεʹର͢Δ੍ݶ –ΞΫηε੍ݶͳͲΛߦ͏ʹCookie
ͳͲैདྷͲ͓Γͷํ๏͕ඞཁ
CORSͷҙ ͦͷ2/3 • ΞΫηε͠ͳ͍Θ͚Ͱͳ͍ –Access-‐Control-‐Allow-‐OriginͰڐՄ͞Ε͍ͯͳ͍ ΦϦδϯ͔ΒͷΞΫηεϦΫΤετࣗମ ૹ৴͞ΕΔ –ϦΫΤετ͕ૹ৴͞Ε͚ͨͩͰॲཧ͕ߦΘΕ
ΔͷͰɺAccess-‐Control-‐Allow-‐OriginͰڐՄ ͍ͯ͠ͳ͍ΦϦδϯ͔Βॲཧ͕ߦΘΕΔ –͜ͷ߹ɺैདྷͲ͓ΓCookieͳͲͰΞΫη ε੍ݶΛߦ͏͜ͱ͕ඞཁ
CORSͷҙ ͦͷ3/3 • Cookie௨ৗૹ৴͞Εͳ͍ – CookieΛ༻͢Δ߹ withCredentials ϓϩύςΟΛ༻͍Δ
– CookieΛ༻ͨ͠߹ Access-‐Control-‐Allow-‐Origin: * (ͯ͢ͷΦϦδϯ͔ΒͷΞΫη εΛڐՄ) ͱ͍͏ࢦఆΛ͢Δ͜ͱ্༷ېࢭ͞Ε͍ͯΔɻ xhr.open( "GET", "http://other.example.jp", true ); xhr.withCredentials = true; xhr.onreadystatechange = function(){ if( xhr.readyState == 4 && xhr.status == 200 ){ div.appendChild( document.createTextNode( xhr.responseText ) ); } }; xhr.send( null );
CookieΛ͏߹ͷHTTP • HTTP௨৴(ൈਮ) GET /xhr_api.php HTTP/1.1 Host: server1.owaspkansai.test
Origin: http://server2.owaspkansai.test Referer: http://server1.owaspkansai.test/xhr_normal.php Cookie: cookie1=1234567890 HTTP/1.1 200 OK Date: Wed, 04 Jun 2014 09:13:08 GMT Server: Apache Access-‐Control-‐Allow-‐Origin: http://server1.owaspkansai.test access-‐control-‐allow-‐credentials: true Content-‐Type: text/html "
͍͔Μͷ͔ʁ • ϦΫΤετͷΦϦδϯΛAccess-‐Control-‐Allow-‐Originʹೖ ΕΕɺͯ͢ͷΦϦδϯ͔ΒCookieΛड͚औΕΔʁ GET /xhr_api.php HTTP/1.1 Host: server2.owaspkansai.test
Origin: http://server1.owaspkansai.test Referer: http://server1.owaspkansai.test/xhr_normal.php Cookie: cookie1=1234567890 HTTP/1.1 200 OK Date: Wed, 04 Jun 2014 09:13:08 GMT Server: Apache Access-‐Control-‐Allow-‐Origin: _________________________ access-‐control-‐allow-‐credentials: true Content-‐Type: text/html "
͍͔ΜͰ͠ΐ • αΠτͷػີใΛ֎෦ʹૹ৴͞ΕΔՄೳੑ͕ ͋Δ – ߈ܸऀͷίϯςϯπ͔ΒɺCookie͖ϦΫΤετΛ ૹ৴͢Δ͜ͱ͕Ͱ͖Δ –
ݸਓใ͕֎෦ʹૹ৴͞ΕΔՄೳੑ͋Δ ߈ܸऀͷαΠτ ਖ਼نαΠτ JavaScript Cookie ݸਓใͱ͔ ߈ܸऀ Ϣʔβ
ָউ XSSൃੜ͢Δؾͤ͑Μ Content Security Policy ͬͯΔ ͠ͷר
Content-‐Security-‐Policyͱ • CSP : Content-‐Security-‐Policy –ಡΈࠐΈՄೳͳϦιʔεͷΦϦδϯΛϙϦγʔ ͱͯ͠ࢦఆ͢Δ •
ΠϯϥΠϯͰ࣮ߦ͞ΕΔJavaScriptͳͲͷ੍ݶߦ ͏͜ͱ͕Ͱ͖Δ • ը૾iframeͳͲͷϦιʔεͷಡΈࠐΈݩΦϦδ ϯΛࢦఆ͢Δ͜ͱ͕Ͱ͖Δ –XSS߈ܸͷՄೳੑΛܰݮ͢Δ͜ͱ͕Ͱ͖Δ –खʹෛ͑ͳ͍
CSPͷରԠঢ়گ ʮCan I use …ʯ͔ΒͷҾ༻Ͱ࣮ࡍࢼ͍ͯ͠·ͤΜ http://caniuse.com/
CSPͷ͍ํ • Content-‐Security-‐PolicyϔομΛϨεϙϯ εʹ͚ͭΔ͚ͩ " εΫϦϓτʹؔͯ͠ɺυΩϡϝϯτࣗͱಉҰͷΦϦδϯ ͷ߹ͷΈڐՄ͢Δ Content-‐Security-‐Policy: script-‐src ‘self’
σΟϨΫςΟϒ σΟϨΫςΟϒιʔε
CSPͷ͍ํ • ϒϥβʹΑͬͯॻ͖ํ͕ҧ͏ –Content-‐Security-‐Policy • W3Cඪ४
• Chrome 25 Ҏ߱ɺFirefox 23 Ҏ߱, Opera 19 Ҏ߱ɺ Safari 7 Ҏ߱ –X-‐Content-‐Security-‐Policy • Firefox 23 ΑΓલɺ Internet Explorer version 10 Ҏ߱ ʢ੍ݶతʣ –X-‐WebKit-‐CSP • Chrome 25ɺSafari 7 Ҏ߱
CSPͷ͍ํ • Content-‐Security-‐Policyͷ͍Ζ͍Ζͳ͍ ํ " ը૾σʔλͷΈɺimg.example.com ͔ΒͷϦιʔεΛڐՄ ͠ɺͦΕҎ֎ͷϦιʔεɺυΩϡϝϯτࣗͱಉҰϦιʔ εͷΈڐՄ͢Δ Content-‐Security-‐Policy:
default-‐src 'self'; img-‐src img.example.com (ϝϞ) default-‐src ͱ͢Δͱɺimg-‐srcͳͲݸผͰࢦఆ͞Ε͍ͯͳ͍Ҏ֎ͷ σΟϨΫςΟϒͷϙϦγʔΛࢦఆ͢Δ͜ͱ͕Ͱ͖Δ
CSPͷ͍ํ • Content-‐Security-‐Policyͷ͍Ζ͍Ζͳ͍ ํ " ΠϯϥΠϯͷεΫϦϓτهड़ΛڐՄ͢Δ JavaScriptͰͷevalɺsetTimeout ͳͲͷจࣈྻ͔ΒίʔυΛ ੜ͢ΔػೳϙϦγʔҧͱ࣮ͯ͠ߦ͞Εͳ͍
Content-‐Security-‐Policy: script-‐src ‘unsafe-‐inline’ (ϝϞ) ‘unsafe-‐eval’ ͱ͢Δ͜ͱͰจࣈྻ͔ΒͷίʔυੜΛ༗ޮʹ͢Δ ελΠϧγʔτΛࢦ͢σΟϨΫςΟϒ style-‐srcͰ༻Ͱ͖Δ
CSPͷҙ • ैདྷͲ͓ΓͷXSS͓͖ͯ͠·͠ΐ͏ –CSPͷهड़ํ๏ࠓޙ౷Ұ͞ΕΔ༧ఆͰ͋ Δ͕ɺϒϥβʹΑͬͯهड़ํ๏͕ҟͳ Δ߹͕͋Δ –ରԠ͍ͯ͠ͳ͍ϒϥβ͋Δ
–ϙϦγʔΛݫ͘͢͠Δͱਖ਼ͳJavaScript ಈ͔ͳ͘ͳΔ߹͕͋Δ –͍Ζ͍ΖมΘͬͨΓͯͯ͠ਖ਼Θ͔ΒΜ
CSPϨϙʔτ • ϙϦγʔҧΛใࠂ͢ΔϨϙʔτػೳ – ϙϦγʔҧ͕ىͬͨ࣌͜ʹҧϨϙʔτ͕ࢦఆ ͨ͠URLʹૹ৴͞ΕΔ – ҧϨϙʔτͷૹ৴ઌͰεΫϦϓτΛॻ͘͜ͱͰɺ
࣮ͷෆඋɺXSS߈ܸͷݕͳͲ੬ऑੑͷૣظൃݟ ͳͲ͕ظͰ͖Δ Content-‐Security-‐Policy: script-‐src ‘self’; report-‐uri http://example.jp/ report.cgi Ϩϙʔτͷૹ৴ઌ
CSP : script-‐src ‘self’ CSPτϦϏΞ • iframeͰಡΈࠐΜͩ߹Ͱಈ͘Α͏ <!DOCTYPE html>
<html> " " " " " " " </html> " " " <iframe> <!DOCTYPE html> <html> <script>alert(1);</script> </html> server1 server2
ָউෛ͚Δ͖ͤ͐Μ ͏·ͱΊΔ͠
·ͱΊ • XMLHttpRequest – ௨ৗಉҰΦϦδϯͷΈ – CORS͕αϙʔτ͞Ε͍ͯΔϒϥβͰΫϩεΦϦδϯͰͷ௨ ৴͕ՄೳʹͳΔ
– CookieͷऔΓѻ͍ํͳͲɺηΩϡϦςΟ্ͷҙΛ্ͬͨͰ ҙ͕ඞཁ • Content-‐Security-‐Policy – ϨεϙϯεϔομΛ͚ͭΔͱɺϦιʔεಡΈࠐΈ࣌ʹ༷ʑͳϙ ϦγʔΛ͚ͭΔ͜ͱ͕Ͱ͖Δ – αϙʔτ͍ͯ͠ͳ͍ϒϥβ͋ΔͷͰઈରతͳͷͰͳ͍ – XSS߈ܸͷܰݮͱͳΔ – ϨϙʔτػೳΛ༻͢ΔͱϙϦγʔҧΛݕ͢Δ͜ͱ͕Ͱ͖ Δ
ࢀߟจݙ JPCERT/CC HTML5 Λར༻ͨ͠Web ΞϓϦέʔγϣϯͷηΩϡϦςΟʹؔ͢Δௐࠪใࠂॻ https://www.jpcert.or.jp/research/html5.html "
HTML5࣌ͷʮ৽͍͠ηΩϡϦςΟɾΤνέοτʯ http://www.atmarkit.co.jp/ait/articles/1311/26/news007.html ͕ͤΘΑ͏͚͢ ͞Μ " ʮWebΞϓϦέʔγϣϯ։ൃʹ͓͚ΔHTML5ͷηΩϡϦςΟʯ https://speakerdeck.com/owaspjapan/html5-‐security-‐for-‐web-‐application-‐development-‐number-‐ appsecapac2014 OWASP AppSec APAC 2014 in Tokyo দຊ ӻٓ " ʮHTML5 Security & Headers -‐ X-‐Crawling-‐Response-‐Header -‐ʯ https://www.jpcert.or.jp/present/2014/20140218CODEBLUE-‐HTML5_ja.pdf CODE BLUE ॏ ༑ߦ ͞Μ
͓ΘΓ • ࣭ͳͲ y-‐
[email protected]
@ym405nm