BrowExt - permissions & host_permissions
Basic Information
permissions
permissions
Permissions는 확장 프로그램의 manifest.json
파일에서 permissions
속성을 사용하여 정의되며, 브라우저가 접근할 수 있는 거의 모든 것(쿠키 또는 물리적 저장소)에 대한 접근을 허용합니다:
이전 매니페스트는 확장 프로그램이 storage
권한을 요구한다고 선언합니다. 이는 저장소 API를 사용하여 데이터를 지속적으로 저장할 수 있음을 의미합니다. 사용자에게 어느 정도의 제어를 제공하는 쿠키나 localStorage
API와 달리, 확장 프로그램 저장소는 일반적으로 확장 프로그램을 제거해야만 지울 수 있습니다.
확장 프로그램은 manifest.json
파일에 표시된 권한을 요청하며, 확장 프로그램을 설치한 후에는 브라우저에서 항상 권한을 확인할 수 있습니다, 아래 이미지와 같이:
Chromium 브라우저 확장이 요청할 수 있는 권한의 전체 목록은 여기에서 확인할 수 있습니다 및 Firefox 확장 프로그램의 전체 목록은 여기에서 확인할 수 있습니다.
host_permissions
host_permissions
선택적이지만 강력한 설정인 **host_permissions
**는 확장 프로그램이 cookies
, webRequest
, 및 tabs
와 같은 API를 통해 상호작용할 수 있는 호스트를 나타냅니다.
다음 host_permissions
는 기본적으로 모든 웹을 허용합니다:
이것들은 브라우저 확장 프로그램이 자유롭게 접근할 수 있는 호스트입니다. 이는 브라우저 확장 프로그램이 **fetch("https://gmail.com/")
**를 호출할 때 CORS에 의해 제한되지 않기 때문입니다.
permissions
및 host_permissions
악용하기
permissions
및 host_permissions
악용하기탭
게다가, **host_permissions
**는 “고급” 탭 API 기능을 잠금 해제합니다. 이들은 확장 프로그램이 tabs.query()를 호출하여 사용자의 브라우저 탭 목록을 가져오고, 어떤 웹 페이지(주소 및 제목)가 로드되었는지 알 수 있게 해줍니다.
그뿐만 아니라, tabs.onUpdated 와 같은 리스너도 훨씬 더 유용해집니다. 이들은 새로운 페이지가 탭에 로드될 때마다 알림을 받습니다.
콘텐츠 스크립트 실행
콘텐츠 스크립트는 반드시 확장 프로그램 매니페스트에 정적으로 작성될 필요는 없습니다. 충분한 **host_permissions
**가 주어지면, 확장 프로그램은 tabs.executeScript() 또는 scripting.executeScript()를 호출하여 동적으로 로드할 수 있습니다.
두 API 모두 확장 프로그램에 포함된 파일뿐만 아니라 임의의 코드를 콘텐츠 스크립트로 실행할 수 있게 해줍니다. 전자는 문자열로 JavaScript 코드를 전달할 수 있게 해주고, 후자는 주입 취약점에 덜 취약한 JavaScript 함수를 기대합니다. 그럼에도 불구하고, 두 API 모두 잘못 사용되면 큰 혼란을 초래할 수 있습니다.
위의 기능 외에도, 콘텐츠 스크립트는 예를 들어 웹 페이지에 입력되는 자격 증명을 가로챌 수 있습니다. 이들을 악용하는 또 다른 고전적인 방법은 모든 웹사이트에 광고를 주입하는 것입니다. 뉴스 웹사이트의 신뢰성을 악용하기 위해 사기 메시지를 추가하는 것도 가능합니다. 마지막으로, 이들은 은행 웹사이트를 조작하여 자금 이체를 우회할 수 있습니다.
암묵적 권한
일부 확장 프로그램 권한은 명시적으로 선언할 필요가 없습니다. 한 예로 탭 API가 있습니다: 기본 기능은 어떤 권한 없이도 접근할 수 있습니다. 어떤 확장 프로그램이든 사용자가 탭을 열고 닫을 때 알림을 받을 수 있지만, 이 탭이 어떤 웹사이트와 관련이 있는지는 알 수 없습니다.
너무 무해하게 들리나요? tabs.create() API는 그리 무해하지 않습니다. 이는 새 탭을 생성하는 데 사용될 수 있으며, 본질적으로 window.open()과 동일합니다. 그러나 window.open()
은 팝업 차단기의 영향을 받지만, tabs.create()
는 그렇지 않습니다.
확장 프로그램은 원할 때마다 원하는 만큼의 탭을 생성할 수 있습니다.
tabs.create()
매개변수를 살펴보면, 그 기능이 window.open()
이 허용하는 것보다 훨씬 더 넓다는 것을 알 수 있습니다. Firefox는 이 API와 함께 data:
URI의 사용을 허용하지 않지만, Chrome은 그러한 보호가 없습니다. 최상위에서 이러한 URI의 사용은 피싱에 악용되었기 때문에 금지되었습니다.
tabs.update()는 tabs.create()
와 매우 유사하지만 기존 탭을 수정합니다. 따라서 악의적인 확장 프로그램은 예를 들어 임의로 광고 페이지를 사용자의 탭 중 하나에 로드할 수 있으며, 해당 탭을 활성화할 수도 있습니다.
웹캠, 지리적 위치 및 친구들
웹사이트가 특별한 권한을 요청할 수 있다는 것을 아실 것입니다. 예를 들어 웹캠(화상 회의 도구)이나 지리적 위치(지도)에 접근하기 위해서입니다. 이는 악용 가능성이 상당한 기능이므로 사용자는 매번 여전히 이를 원한다고 확인해야 합니다.
브라우저 확장 프로그램은 그렇지 않습니다. 브라우저 확장 프로그램이 웹캠이나 마이크에 접근하고 싶다면, 단 한 번만 권한을 요청하면 됩니다.
일반적으로 확장 프로그램은 설치 직후에 그렇게 합니다. 이 프롬프트가 수락되면, 웹캠 접근은 언제든지 가능해지며, 사용자가 이 시점에서 확장 프로그램과 상호작용하지 않더라도 가능합니다. 예, 사용자는 확장 프로그램이 정말로 웹캠 접근이 필요할 때만 이 프롬프트를 수락할 것입니다. 그러나 그 이후에는 확장 프로그램이 비밀리에 녹음하지 않을 것이라고 신뢰해야 합니다.
당신의 정확한 지리적 위치 또는 클립보드의 내용에 접근하는 경우, 권한을 명시적으로 부여할 필요가 전혀 없습니다. 확장 프로그램은 단순히 geolocation
또는 clipboard
를 매니페스트의 권한 항목 에 추가합니다. 이러한 접근 권한은 확장 프로그램이 설치될 때 암묵적으로 부여됩니다. 따라서 이러한 권한을 가진 악의적이거나 손상된 확장 프로그램은 사용자가 아무것도 눈치채지 못한 채로 당신의 이동 프로필을 생성하거나 복사된 비밀번호를 모니터링할 수 있습니다.
history
키워드를 확장 프로그램 매니페스트의 권한 항목에 추가하면 **history API
**에 대한 접근 권한이 부여됩니다. 이를 통해 사용자의 전체 브라우징 기록을 한 번에 검색할 수 있으며, 사용자가 이러한 웹사이트를 다시 방문할 때까지 기다릴 필요가 없습니다.
bookmarks
권한은 유사한 악용 가능성을 가지고 있으며, 이 권한은 모든 북마크를 북마크 API 를 통해 읽어올 수 있게 해줍니다.
저장소 권한
확장 프로그램 저장소는 단순히 키-값 컬렉션으로, 어떤 웹사이트에서도 사용할 수 있는 localStorage와 매우 유사합니다. 따라서 여기에는 민감한 정보를 저장해서는 안 됩니다.
그러나 광고 회사는 이 저장소를 악용할 수도 있습니다.
더 많은 권한
Chromium 브라우저 확장이 요청할 수 있는 권한의 전체 목록은 여기에서 확인할 수 있습니다 및 Firefox 확장 프로그램의 전체 목록은 여기에서 확인할 수 있습니다.
예방
구글 개발자의 정책은 확장 프로그램이 기능에 필요한 것보다 더 많은 권한을 요청하는 것을 명시적으로 금지하여 과도한 권한 요청을 효과적으로 완화합니다. 브라우저 확장 프로그램이 이 경계를 넘은 사례는 애드온 스토어가 아닌 브라우저 자체와 함께 배포된 경우입니다.
브라우저는 확장 프로그램 권한의 악용을 더욱 억제할 수 있습니다. 예를 들어, Chrome의 tabCapture 및 desktopCapture API는 화면 녹화를 위해 설계되었으며, 악용을 최소화하도록 설계되었습니다. tabCapture API는 확장 프로그램 아이콘을 클릭하는 것과 같은 직접적인 사용자 상호작용을 통해서만 활성화될 수 있으며, desktopCapture는 녹화할 창에 대한 사용자 확인을 요구하여 은밀한 녹화 활동을 방지합니다.
그러나 보안 조치를 강화하면 종종 확장 프로그램의 유연성과 사용자 친화성이 감소합니다. activeTab 권한은 이러한 균형을 보여줍니다. 이는 확장 프로그램이 전체 인터넷에 대한 호스트 권한을 요청할 필요를 없애기 위해 도입되었으며, 사용자가 명시적으로 활성화할 때만 현재 탭에 접근할 수 있도록 허용합니다. 이 모델은 사용자 주도 작업이 필요한 확장 프로그램에는 효과적이지만, 자동 또는 사전 조치가 필요한 확장 프로그램에는 부족하여 편의성과 즉각적인 반응성을 저해합니다.
참고문헌
Last updated