보안 유지

확장 프로그램은 브라우저 내에서 특별한 권한에 액세스할 수 있기 때문에 있습니다. 확장 프로그램의 보안이 침해되면 해당 확장 프로그램의 모든 사용자가 원치 않는 침입을 방지할 수 있습니다. 다음을 통합하여 확장 프로그램의 보안을 유지하고 사용자를 보호합니다. 살펴봤습니다

개발자 계정 보호

확장 프로그램 코드는 Google 계정을 통해 업로드 및 업데이트됩니다. 개발자의 경우 계정이 공격자가 모든 사용자에게 악성코드를 직접 푸시할 수 있습니다. 계정 보호 특별히 개발자 계정을 만들고 2단계 인증을 사용 설정하는 것이 좋습니다. 보안 키 사용

그룹을 선택적으로 유지

그룹 게시를 사용하는 경우 그룹을 신뢰할 수 있는 개발자에게만 공개하세요. 수락하지 않음 알 수 없는 사용자의 멤버십 요청입니다.

절대로 HTTP 사용 안 함

데이터를 요청하거나 보낼 때 HTTP 연결을 피합니다. 모든 HTTP 연결이 도청을 하거나 수정을 가하는 행위를 해서는 안 됩니다. 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/"가 나열되는 것을 볼 수 있습니다. 만약 확장 프로그램을 사용하는 경우 해당 외부 소프트웨어는 일치 패턴을 반환합니다. 공격자는 "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과 상호작용하려면 콘텐츠 스크립트가 있습니다. 이로 인해 콘텐츠 스크립트가 부채널 공격을 통한 데이터 유출에 취약해집니다. (예: Spectre) 악성 웹페이지가 손상될 경우 공격자가 점령하도록 할 수 있습니다. 프로세스입니다.

민감한 작업은 확장 프로그램의 백그라운드와 같은 전용 프로세스에서 실행되어야 합니다. 스크립트를 참고하세요. 실수로 확장 프로그램 권한을 콘텐츠 스크립트에 노출하지 않도록 하세요.

입력 등록 및 정리

리스너를 확장 프로그램의 기능에만 한정하여 악성 스크립트로부터 확장 프로그램을 보호합니다. 수신 데이터의 발신자를 예상하고 검증하며 모든 입력을 정리하는 작업이 포함됩니다.

확장 프로그램은 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, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;');
}