확장 프로그램은 브라우저 내에서 특별한 권한에 액세스할 수 있기 때문에 있습니다. 확장 프로그램이 공격을 당하면 해당 프로그램의 모든 사용자는 원치 않는 악성 침입에 취약해집니다. 이러한 관행을 통합하여 확장 프로그램의 보안을 유지하고 사용자를 보호하세요.
개발자 계정 보호
확장 프로그램 코드는 Google 계정을 통해 업로드 및 업데이트됩니다. 개발자의 경우 계정이 공격자가 모든 사용자에게 악성코드를 직접 푸시할 수 있습니다. 개발자 계정을 만들고 2단계 인증을 사용 설정하여 이러한 계정을 보호하세요(보안 키를 사용하는 것이 좋음).
그룹을 선택적으로 유지
그룹 게시를 사용하는 경우 그룹을 신뢰할 수 있는 개발자에게만 공개하세요. 수락하지 않음 알 수 없는 사용자의 멤버십 요청입니다.
절대로 HTTP 사용 안 함
데이터를 요청하거나 보낼 때 HTTP 연결을 피합니다. 모든 HTTP 연결에 도청자가 있거나 수정사항이 포함되어 있다고 가정합니다. HTTPS는 대부분의 중간자 공격을 우회하는 보안이 내장되어 있으므로 항상 HTTPS를 사용하는 것이 좋습니다.
최소 권한 요청
Chrome 브라우저는 확장 프로그램이 매니페스트에 저장된 객체입니다. 확장 프로그램은 API 및 도움이 될 수 있습니다 임의의 코드는 최소한으로 유지하는 것이 좋습니다.
확장 프로그램 권한을 제한하면 잠재적 공격자가 악용할 수 있는 범위가 제한됩니다.
교차 출처 XMLHttpRequest
확장 프로그램은 XMLHttpRequest만 사용하여 자체 및 도메인에서 리소스를 가져올 수 있습니다. 권한을 부여할 수 있습니다
{
"name": "Very Secure Extension",
"version": "1.0",
"description": "Example of a Secure Extension",
"permissions": [
"/*",
"https://*.google.com/"
],
"manifest_version": 2
}
이 확장 프로그램은 권한에 "/*"
및 "https://*google.com/"
를 나열하여 developer.chrome.com 및 Google의 하위 도메인에 있는 모든 항목에 대한 액세스를 요청합니다. 확장 프로그램이 손상되더라도 일치 패턴을 충족하는 웹사이트와만 상호작용할 수 있는 권한만 유지됩니다. 공격자는 "https://user_bank_info.com"
에 액세스하거나 "https://malicious_website.com"
와 상호작용할 수 없습니다.
매니페스트 필드 제한
매니페스트에 불필요한 등록을 포함하면 취약점이 발생하고 확장 프로그램이 더 눈에 띄게 됩니다. 매니페스트 필드를 확장 프로그램이 사용하는 필드로 제한하고 특정 필드 제공 등록.
외부에서 연결 가능
externally_connectable
필드를 사용하여 확장 프로그램이 정보를 교환할 외부 확장 프로그램과 웹페이지를 선언합니다. 확장 프로그램이 외부에서 연결할 수 있는 대상을 제한합니다.
신뢰할 수 있는 소스
{
"name": "Super Safe Extension",
"externally_connectable": {
"ids": [
"iamafriendlyextensionhereisdatas"
],
"matches": [
"/*",
"https://*google.com/"
],
"accepts_tls_channel_id": false
},
...
}
웹에서 액세스할 수 있는 리소스
web_accessible_resources
를 통해 웹에서 리소스에 액세스할 수 있도록 만들면
탐지할 수 있는 확장 프로그램입니다.
{
...
"web_accessible_resources": [
"images/*.png",
"style/secure_extension.css",
"script/secure_extension.js"
],
...
}
웹에 액세스할 수 있는 리소스가 많을수록 잠재적인 공격자가 악용할 수 있는 경로도 더 많아집니다. 이러한 파일은 최소한으로 유지하세요.
명시적인 콘텐츠 보안 정책 포함
매니페스트에 확장 프로그램의 콘텐츠 보안 정책을 포함하여 크로스 사이트 방지 스크립팅 공격을 탐지할 수 있습니다. 확장 프로그램이 자체에서만 리소스를 로드하는 경우 다음을 등록합니다.
{
"name": "Very Secure Extension",
"version": "1.0",
"description": "Example of a Secure Extension",
"content_security_policy": "default-src 'self'"
"manifest_version": 2
}
확장 프로그램에 특정 호스트의 스크립트를 포함해야 하는 경우 포함할 수 있습니다.
{
"name": "Very Secure Extension",
"version": "1.0",
"description": "Example of a Secure Extension",
"content_security_policy": "default-src 'self' https://extension.resource.com"
"manifest_version": 2
}
실행 가능한 API 피하기
코드를 실행하는 API는 더 안전한 대안으로 대체해야 합니다.
document.write() 및 innerHTML
document.write()
및 innerHTML
를 사용하여 동적으로 HTML 요소를 만드는 것이 더 간단할 수 있지만
확장 프로그램 및 확장 프로그램이 의존하는 웹페이지가 공격자에게 열려
악성 스크립트일 수도 있습니다. 대신 수동으로 DOM 노드를 만들고 innerText
를 사용하여 동적 콘텐츠를 삽입하세요.
function constructDOM() {
let newTitle = document.createElement('h1');
newTitle.innerText = host;
document.appendChild(newTitle);
}
eval()
eval()
는 전달된 모든 코드를 실행하므로 악성일 수 있으므로 가능하면 공격을 방지하기 위해 eval()
를 사용하지 마세요.
var xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.example.com/data.json", true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
// WARNING! Might be evaluating an evil script!
var resp = eval("(" + xhr.responseText + ")");
...
}
}
xhr.send();
대신 JSON.parse()
와 같이 더 안전하고 빠른 메서드를 사용하세요.
var xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.example.com/data.json", true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
// JSON.parse does not evaluate the attacker's scripts.
var resp = JSON.parse(xhr.responseText);
}
}
xhr.send();
신중하게 콘텐츠 스크립트 사용
콘텐츠 스크립트는 격리된 환경에 있지만 공격으로부터 자유롭지는 않습니다.
- 콘텐츠 스크립트는 확장 프로그램에서 웹페이지와 직접 상호작용하는 유일한 부분입니다. 이 때문에 적대적인 웹 페이지는 콘텐츠 스크립트가 의존하는 DOM의 일부를 조작할 수 있습니다. 이름이 지정된 항목과 같은 예상치 못한 웹 표준 동작을 악용하지 못할 수도 있습니다.
- 웹페이지의 DOM과 상호작용하려면 콘텐츠 스크립트가 있습니다. 따라서 콘텐츠 스크립트는 측면 채널 공격(예: 스펙터) 악성 웹페이지가 손상될 경우 공격자가 점령하도록 할 수 있습니다. 프로세스입니다.
민감한 작업은 확장 프로그램의 백그라운드와 같은 전용 프로세스에서 실행되어야 합니다. 스크립트를 참고하세요. 확장 프로그램 권한을 콘텐츠 스크립트에 실수로 노출하지 않도록 합니다.
- 콘텐츠 스크립트의 메시지가 공격자에 의해 조작되었을 수 있다고 가정합니다(예: 모든 입력을 유효성 검사 및 정리하고 교차 사이트 스크립팅으로부터 스크립트를 보호).
- 콘텐츠 스크립트로 전송된 모든 데이터가 웹페이지로 유출될 수 있다고 가정합니다. 민감한 정보(예: 확장 프로그램의 보안 비밀, 다른 웹 출처의 데이터, 방문 기록)를 콘텐츠 스크립트에 전송하지 마세요.
- 콘텐츠 스크립트에 의해 트리거될 수 있는 권한 있는 작업의 범위를 제한합니다. 허용 안 함
임의의 URL에 대한 요청을 트리거하거나
확장 프로그램 API (예:
fetch
또는chrome.tabs.create
API).
입력 등록 및 정리
리스너를 확장 프로그램에서 예상하는 항목으로만 제한하고, 수신 데이터의 발신자를 확인하고, 모든 입력을 정리하여 악성 스크립트로부터 확장 프로그램을 보호합니다.
확장 프로그램은 runtime.onRequestExternal
에만 등록해야 합니다(예상되는 경우).
커뮤니케이션을 방지할 수 있습니다 항상 발신자가 신뢰할 수 있는 소스와 일치하는지 확인합니다.
// The ID of an external extension
const kFriendlyExtensionId = "iamafriendlyextensionhereisdatas";
chrome.runtime.onMessageExternal.addListener(
function(request, sender, sendResponse) {
if (sender.id === kFriendlyExtensionId)
doSomething();
});
확장 프로그램 자체의 runtime.onMessage 이벤트를 통한 메시지도 면밀히 조사되어야 합니다. MessageSender가 손상된 콘텐츠 스크립트에서 온 것이 아닌지 확인합니다.
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.allowedAction)
console.log("This is an allowed action.");
});
확장 프로그램 자체 및 승인된 소스에서 들어오는 사용자 입력과 데이터를 정리하여 확장 프로그램이 공격자의 스크립트를 실행하지 못하도록 합니다. 실행 파일 API를 피합니다.
function sanitizeInput(input) {
return input.replace(/&/g, '&').replace(/</g, '<').replace(/"/g, '"');
}