4

Greasemonkey 또는 Chrome의 콘텐츠 스크립트 엔진과 유사한 스크립팅 확장 프로그램을 개발 중입니다. 이 확장 기능을 사용하여 스크립트 작성자는 로컬 파일에 액세스하는 것과 같은 매우 위험한 작업을 수행 할 수 있습니다.자바 스크립트 (또는 브라우저 확장 프로그램)가 제한된 기능의 사용을 어떻게 감지합니까?

이 확장 기능을 대중에게 공개 한 경우 스크립트에서 "위험한"기능을 사용하면 초보 사용자에게 경고 할 수 있기를 바랍니다. 이 경고문을 가능한 한 우회하기가 어렵도록하고 싶습니다.

예를 들어, 확장 사용자를 보호 된 문자열 GM_openSQL_Connection를 검색하고 경고 할 수 - 아마도 같은 : Bad script warning


은 기본 웹 페이지가 샌드 박스 메커니즘 GM_openSQL_Connection 덕분에 액세스 할 수 없을 것이라는 점을 가정 . 마찬가지로, <script> 노드는 할 수 없습니다.

그러나, 스크립트 작가가 여전히 같은 뭔가 위에서, 간단한 검색을 피할 수 :

eval (decodeURI ("GM_op%65nSQL_Connection (...);")) 


그래서 질문하는 악한 스크립터는 속일 수있는 방법의 종류 무엇 입니다 제한된 기능 사용에 대한 점검, 그리고 그러한 장난을 어떻게 막을 수 있습니까?


참고 : 허위 경고는 괜찮을 수 있습니다. 예를 들어 스크립트 작성자가 정적 문자열에서 "GM_openSQL_Connection"이라는 텍스트를 사용하는 경우 그는 (false) 경고를 지정하기 만하면됩니다.

+2

완전히 관련이 없지만 예제 경고가 마음에 들었습니다. :) – fayerth

+0

위험하다는 것은 함수 이름 만 위험하다고 말할 수는 없습니다. 이름은 블랙리스트에 올라있는 것이 아니라 행동을 위해서만 가능합니다. 쿠키에 직접 액세스하고 제 3 자 호스트에 원격 액세스하는 기능은 일반적으로 위험한 것으로 인식됩니다 (그렇다고 할 수는 없지만 이는 경고 일 수 있습니다). 일부 다른 패턴은 환영받지 못하는 것으로 해석 될 수도 있습니다. – YuS

+0

필자는 [JavaScript Deobfuscator] (https://addons.mozilla.org/addon/javascript-deobfuscator/)와 동일한 접근법을 사용하는 것이 좋습니다 (디버깅 인터페이스를 사용하여 컴파일 방법에 관계없이 모든 함수 호출을 얻을 수 있습니다). 그게 도움이되지 않을거야. 'var foo = window [ "GM_op"+ "enSQL_Connection"]; foo (...)'를 고려하십시오. 함수 이름이 너무 쉽게 바뀔 수 있기 때문에 함수 이름으로 갈 수 없습니다. –

답변

4

악의적 인 스크립터가 제한 기능에 대한 검사를 속일 수있는 방법은 무엇입니까?

는, 예를 들면, 조합의 수천이있다 eval(), new Function() (귀하의 예제처럼) String.fromCharCode()decodeURI()의 조합.

어떻게 그러한 장난을 예방할 수 있습니까?

오버로드/그림자 특정 불량품 함수/개체/변수를 추가 할 수 있습니까? 확장이 금지 된 함수 나 변수에 액세스하려고하면

GM_openSQL_Connection = function() { 
    warnUser(); 
}; 

에 액세스하고, 단순히 금지 된 함수가 호출되는 경우 true로 설정되어 var isDangerous = false 또는 금지 재산에 get/ set이 플래그를 설정하려면/수정 됨.

isDangeroustrue 인 경우 위험한 기능/속성 호출/액세스가있는 것으로 해당 확장을 표시 할 수 있습니다.

+0

흠. 그 그림자는 잠재력이 있습니다. 개발자가 코드에서 사용하는 위험한 기능을 스스로보고하도록 요구할 수 있습니다. 사용자는 표시된대로 설치시 경고를받으며 해당 스크립트에 대한 런타임 경고가 비활성화됩니다. 선언되지 않은 함수는 여전히 런타임 경고를 발생 시키므로 대충 또는 부주의 한 코딩의 증거가 될 수 있습니다. –

+0

음, 특정 음영 기능을 음영 처리하는 것은 블랙리스트 작성입니다. 확률은 귀하의 블랙리스트가 불완전한 것입니다. 블랙리스트는 깨지기 쉬운 경향이 있습니다. –

+1

@ D.W., 당신을 따르지 않습니다.나는이 기능을 만들고 런타임 동작을 완전히 제어합니다 (모르는 보안 취약점 제외). 스크립트 작성자가 어떻게 우회 할 수 있습니까? –

2

스크립트를 검사하여 인터페이스를 사용하는지 여부를 감지하는 것은 잘못된 방법입니다. 당신이 발견하는 것처럼 보이기 때문에 난독 화를 피하기가 너무 쉽습니다. 근본적으로 안전하지 않습니다. 작동하게 만드는 방법은 없습니다.

더 나은 접근 방법입니다.스크립트 작성자가 액세스해야하는 특수 API를 선언하는 목록을 포함하도록합니다. 그런 다음 허용 된 API 및 요청한 API 만 노출하는 보안 자바 스크립트 샌드 박스에서 스크립트를 실행하십시오. 스크립트가 매니페스트에 GM_openSQL_Connection을 요청하지 않으면 해당 API를 스크립트에 노출하지 마십시오.

자바 스크립트는 원숭이 패치와 전역 개체에 대한 제한없는 액세스를 허용하는 동적 언어이므로 스크립트에서 액세스 할 수있는 API를 제한하는 안전한 샌드 박스를 만드는 데 일부 작업이 필요합니다. 따라서 기존 샌드 박스 솔루션을 사용하는 것이 좋습니다. 한 가지 방법은 샌드 박스에서 사용자 스크립트를 실행하고 스텁이 postMessage을 사용하여 확장 코드에 RPC 요청을 보내는 민감한 API에 대한 스텁으로 가득 찬 라이브러리 샌드 박스 코드를 제공하는 것입니다. 이렇게하면 샌드 박스 경계를 ​​넘는 참조를 피할 수 있습니다. 샌드 박스 기술에 따라 그러한 종류의 참조가 일반적으로 보안 취약성에 대한 잠재적 가능성을 가지고 있기 때문에 좋습니다.

그런 다음 매니페스트의 내용에 따라 사용자 경고를 보낼 수 있습니다. 중요 : 사용자의 관점에서 신중하게 생각하십시오. 일반 사용자는 경고를 이해할 수 있습니까? 그들은 합리적인 결정을 내릴 수 있습니까? 사용자가 원하는 것보다 더 나은 결정을 내릴 수있는 더 나은 위치에 있습니까? 사용자는 끊임없이 경고에 압도 당하고 무시하고 '확인'(울음 울프 효과)을 클릭하기 만하면됩니까?

자바 스크립트 샌드 박싱 기술에 대한 자세한 내용은 IT 보안에 대한 다음 질문을 읽어보십시오. How to scan Javascript for malicious code?. 앞으로는 이런 종류의 질문에 대해 IT 보안 사이트에 대한 답변을 얻을 수 있습니다.

+0

지금까지 경험했거나 읽은 모든 것을 무시합니다. 확장 기능이 제공 할 수있는 API 외부의 확장 코드 (**가 아닌 ** 콘텐츠 스크립트 코드)에 액세스 할 수있는 스크립트 코드에 대한 참조 또는 예를 제공하십시오. –

+0

그건 꽤 아키텍처가 아니며 Greasemonkey가 어떻게 운영되는지 잘 모르겠습니다. 사용자 스크립트는 한 번 설치되고 절대로 다운로드되지 않습니다 (업데이트는 해제 됨). 그리고 그것은 단지 '평가'되지 않았습니다. 일부 보안 제한이 적용된 후'evalInSandbox'를 사용하여 실행됩니다. Chrome은 올바르게 이해하면 비슷한 메커니즘을 사용합니다. 귀하의 의견은 여전히 ​​적용될 수 있지만 아직 문서 또는 예제를 보지 못했습니다. –

+0

@BrockAdams, 좋은 지적! 내 오류. 나는 특수한 샌드 박싱 기술 (Caja와 같은)에 대한 필요성에 대한 내 주장을 철회합니다. 나는 evalInSandbox에 대해 완전히 잊었다. 그래서 나는 생각했던 것만 큼 분명히 잘 알려지지 않았다. 내 잘못에 대해 사과드립니다. –