댓글 검색 목록

[기타] chrome extention - 13. 보안 유지

페이지 정보

작성자 운영자 작성일 20-11-04 16:51 조회 677 댓글 0

확장 프로그램은 브라우저 내에서 특별한 권한에 액세스 할 수 있으므로 공격자에게 매력적인 표적이 됩니다. 확장 프로그램이 손상되면 해당 확장 프로그램의 모든 사용자가 악의적이고 원치 않는 침입에 취약 해집니다. 이러한 관행을 통합하여 확장 프로그램을 안전하게 유지하고 사용자를 보호하십시오.


개발자 계정 보호 


확장 코드는 Google 계정을 통해 업로드 및 업데이트 됩니다. 개발자의 계정이 손상되면 공격자가 모든 사용자에게 직접 악성 코드를 보낼 수 있습니다. 특별히 개발자 계정을 만들고 보안 키를 사용하여 이중 인증을 사용하도록 설정하여 이러한 계정을 보호합니다.


그룹을 선택적으로 유지 


그룹 게시를 사용하는 경우 그룹을 신뢰할 수 있는 개발자로 제한하십시오. 알 수 없는 사람의 회원 요청을 수락하지 마십시오.


결코 HTTP를 사용하지 마십시오 


데이터를 요청하거나 보낼 때 HTTP 연결을 피하십시오. 모든 HTTP 연결에 도청자가 있거나 수정 사항이 포함되어 있다고 가정합니다. HTTPS는 대부분의 중간자 (man-in-the-middle) 공격을 우회 하는 보안 기능이 내장되어 있으므로 항상 선호 되어야 합니다.


최소 권한 요청 


Chrome 브라우저는 매니페스트에서 명시 적으로 요청 된 권한에 대한 확장 프로그램의 액세스를 제한합니다. 확장 프로그램은 의존하는 API 및 웹 사이트 만 등록하여 권한을 최소화해야 합니다. 임의의 코드는 최소한으로 유지해야 합니다.


확장 권한을 제한하면 잠재적인 공격자가 악용할 수 있는 항목이 제한됩니다.


Cross-Origin XMLHttpRequest 


확장 프로그램은 XMLHttpRequest를 사용하여 자체 및 권한에 지정된 도메인에서만 리소스를 가져올 수 있습니다.


  {
    "name": "Very Secure Extension",
    "version": "1.0",
    "description": "Example of a Secure Extension",
    "permissions": [
      "https://developer.chrome.com/*",
      "https://*.google.com/"
    ],
    "manifest_version": 2
  }

이 확장 프로그램은 권한에 "https://developer.chrome.com/*"및 "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://developer.chrome.com/*",
        "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;');
  }


댓글목록 0

등록된 댓글이 없습니다.

웹학교 로고

온라인 코딩학교

코리아뉴스 2001 - , All right reserved.