← All reports

Mixed-content carve-out for local and loopback address spaces

Component: WebCore Mixed Content | 66d43be

Mixed Content blocking은 HTTPS 페이지가 안전하지 않은 HTTP sub-resource를 불러오지 못하게 막는 기능입니다. 요청을 HTTPS로 upgrade하거나 아예 거부하는 방식으로 동작하며, 덕분에 network attacker가 secure page의 콘텐츠를 변조할 수 없습니다. 한편 Local Network Access(LNA) 명세는 별도의 permission gate를 도입합니다. 형태로 보면 카메라나 마이크 권한 프롬프트에 가깝고, 사용자의 로컬 네트워크에 있는 장치에 접근하려는 페이지에 적용됩니다. 이 영역은 LAN을 신뢰하는 라우터와 IoT 장치를 겨냥한 SSRF, CSRF 사례가 오랫동안 누적된 곳입니다. 그래서 두 시스템을 서로 연결할 필요가 생깁니다. Mixed Content 쪽에서 자기 규칙을 적용할지 판단하려면, 먼저 요청의 target IP address space를 알아야 하기 때문입니다.

이 commit은 upgrade/block 로직을 수정해, local이나 loopback address space를 대상으로 하는 요청을 예외로 처리합니다. 해당 판단은 LNA의 permission 시스템으로 넘깁니다. 다만 target address space를 명시적으로 설정하는 것은 fetch()뿐입니다. 그래서 이미지, XHR, 일반 sub-resource 같은 non-fetch loader는 새로 추가된 effectiveTargetAddressSpace() helper를 통해 URL에서 값을 도출하도록 변경되었습니다.

이 예외 처리가 없다면 HTTPS 페이지는 로컬 장치에서 평문 HTTP 콘텐츠를 불러올 방법이 전혀 없고, 결과적으로 도입 예정인 LNA permission 프롬프트는 실제로는 도달할 수 없는 기능이 됩니다. 하나의 security check가 다른 check에 자리를 내주는 이음매에 해당합니다. 이때 인계는 빠짐없이 이루어져야 합니다. 둘 사이로 빠지는 요청은 어느 쪽 통제도 받지 않기 때문입니다.

앞으로 눈여겨볼 패턴은, 다른 check가 대신 처리해 줄 것이라는 전제 아래 특정 부류의 요청을 예외로 빼주는 security check입니다. Narrow: effectiveTargetAddressSpace()는 URL에서 address space를 도출합니다. 그래서 이 값을 사용하는 모든 지점에 대해, 도출된 값이 요청이 실제로 도달하는 곳과 달라질 수 있는지 물어봐야 합니다. 달라졌을 때 어떤 결정이 내려지는지까지 함께 살펴볼 필요가 있습니다. Wider: 예외 처리와 LNA permission gate는 하나의 정책을 반씩 나눠 맡고 있습니다. MixedContentChecker에 도달하는 loader 경로를 모두 나열한 뒤, 이제 예외를 적용받는 경로가 실제로 permission gate까지 도달하는지 확인해야 합니다. 어느 쪽 check에도 걸리지 않는 경로가 남아 있으면 문제입니다. 이후에 추가되는 loader가 LNA에 참여하지 않는다면, 예외만 공짜로 물려받게 됩니다. Widest: checker에 새로운 early return이 추가될 때마다, 리뷰어는 예외로 빠진 집합을 누가 대신 책임지는지 이름을 댈 수 있어야 합니다. 코드 리뷰 관점에서 보면, security predicate에 추가되는 early return에는 어떤 check가 그 역할을 넘겨받는지 명시하는 주석이 붙어야 합니다.