2011.05.11 18:34 System

[+] Beginning



약 1년 전에 Google Chrome에서 웹페이지가 로딩 되지 않는 것에 대한 포스팅을 했습니다.

http://linkc.tistory.com/entry/Google-Chrome-Loading-Problem

sandbox 옵션을 사용하지 않으면 해결되는 문제였죠.

그 땐 그런가 보다 하고 넘어갔는데, 최근 다시 그런 문제가 생겨

왜 이런 문제가 일어나는지 , 해당 옵션을 사용하지 않으면 정상적으로 동작하는지

한 번 살펴보기로 했습니다.


[+] Problem



앞서 설명했던 대로입니다.

Chrome을 실행 하면 웹 페이지가 로딩 되지 않습니다.

또 가끔 페이지가 로딩 되더라도 다음과 같은 메세지를 뱉으며 죽어버리기 일수죠.

<Fig1. 크롬이 오류를 내며 죽는 경우>

개발자들의 센스가 보이는 문구네요. 귀엽죠?

<Fig1-2. 귀여워>


크롬을 실행 할 때는 물론, 실행 중에도 간혹 페이지가 뜨지 않는 현상이 발생합니다.


[+] Analysis


 

1. Session 및 Desktop의 생성

크롬은 Sandbox 기능을 사용하고 있습니다.

다음은 실제 크롬을 막 실행 시킨 직후의 모습입니다.


  <Fig2.  메인 크롬 Process의 WindowsStation>



크롬은 각 탭 하나마다 새로운 자식 프로세스를 생성하며, 탭 이외에도 Plug in 이나 확장프로그램을 사용하면 하나씩 늘어납니다.

<Fig2>를 찍을 땐 , 모든 확장 프로그램을 작동 중지한 상태에서 찍어서 2개만 떴지만, 실제 사용하는 확장 프로그램을 모두

사용하면 6~7개 정도의 크롬이 등장합니다.

아무튼 <Fig2>를 보면 아시겠지만 크롬의 WindowStation이 WinSta0 이외에도 하나 더 생성되어 있는 것을 확인할 수 있습니다.

WindowStation?

Session의 하위 개념입니다.

Session > Station > Desktop > Process 순으로 보시면 되겠네요.

자세한 사항은 다음 블로그에 상당히 정리가 잘 되어있으니 참고하시면 도움이 될겁니다 :D

http://www.benjaminlog.com/tag/%EC%9C%88%EB%8F%84%EC%9A%B0%20%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%85%98



메인 프로세스는 이렇게 2개가 혼재하고 일반 탭의 자식 프로세스는 가장 하단의 WindowStation인 Service 어쩌구 하는

Station 만 존재합니다.

<Fig3. CreateWindowStation을 호출하여 Station을 만드는 모습 >

이후에 GetUserObjectInformation 을 이용하여

만든 Station의 이름을 가져옵니다.

<Fig4. GetUserObjectInformation을 호출하여 이름을 얻어온 모습. Service ~ >

확인해보면 <Fig2>와 같은 형식을 지닌 것을 알 수 있죠.

이후 호출하는 함수를 따라가보면 다음 함수를 호출합니다.

<Fig5. CreateDesktop을 호출하여 Fig3에서 생성한 Station 내부에 Desktop을 생성한 모습>

sbox . Sand Box 를 의미하는 것이겠죠?

0xD64 는 해당 메인 Process 의 PID 입니다.



2. Process 생성

<Fig6. CreateProcessAsUsesr를 호출하여 Process를 생성하는 모습>

해당 함수를 MSDN에서 살펴보면

<Fig7. MSDN에서 살펴본 CreateProcessAsUser>


CreateProcess 와 다른 점은 첫번째 인자가 추가되었다는 점 하나 뿐입니다.

이 hToken 값은 생성될 User의 Handle값이 되겠죠.

그리고  STARTUPINFO  구조체의 lpDesktop 변수에 앞서 생성해준 Station 과 Desktop 정보가 들어갑니다.

또한 , 바로 실행하지 않고 Suspend 상태로 Process를 생성하구요.

흠. 보통 일반적인 Process를 생성하는 방법과는 약간 차이가 있네요.

이후에 CreateJobObejct 를 통해 미리 생성해둔 Job에

AssignProcessToJobOjbect 를 통해 Fig6에서 생성이 완료된 Process를 Job에 추가시킵니다.

Job은 일련의 속한 Process에게 공통적인 정책을 적용하기 위해 사용한다고만 알아두시면 될 것 같네요.



3. Check Integrity

이 후 메모리의 무결성을 검사합니다.

이 무결성을 통과하지 못하고 문제가 발생한 경우는 제가 확인했을 때 IAT Hooking 이 이루어질 때 였습니다.

[ 다른 경우가 있다면 알려주세요! ]

해당 Hooking을 거는 프로그램이라고 하면 보안 프로그램이나 악성 프로그램정도가 되겠죠.

Sandbox 내에서 생성된 탭은 일반적인 방법으로는 Hooking 이 되지 않기 때문에

[ 물론 외부 Process와 통신이 필요한 tab은 Sandbox로 생성하지 않습니다. 그런 tab은 Hooking 이 걸리게 되죠. ]

부모, 자기 자신의 Process만 검사하는 것으로 보입니다.

체크후에는 VirtualAllocEx를 통해 Sandbox에 생성한 Process의 메모리에 접근합니다.

제가 확인한 경우는 2가지 입니다.

첫번째는 VirtualAllocEx에서 해당 Process로 접근 하는 메모리에 권한을 주지 않는 방법으로 차단하는 경우,

두번째는 특정 함수를 선택하고  ReadProcessMemory 를 이용하여 Hooking이 되었는지 여부를 확인하고 차단 하는 경우


입니다.

2가지 프로그램 밖에 테스트 해보지 않았지만 다른 것도 비슷할 것으로 보입니다.




4. Terminate Process Or Resume Process

3번의 Integrity 를 통과하지 못하면 Process를 Terminate 합니다.

Terminate Process가 실패하면 GetExitCodeProcess을 통해서 Process를 종료하구요.

뭐 통과를 하게 되면 생성해둔 Process를 다시 동작시킵니다.



5. Conclusion

<Fig2>를 보면 아시겠지만 크롬은 최소 Process가 2개 입니다

하나는 부모 Process , 하나는 탭에 할당된 Process죠.

부모는 다른 Station에서 실행되고 있는 Process를 Control 하는 역할을 하게 되고

실제 페이지를 뿌려주는건 자식 Process 입니다.

만약, 3번 Check를 통과하지 못했다면 결과적으로 남는 것은 부모 Process 하나 뿐입니다.

이렇게 되면 페이지를 탐색할 자식 Process가 없는 꼴이 되니 정상적으로 실행 될 수 없다는 겁니다.

이해 되시나요?

물론 Plug in 이나 확장 프로그램도 모두 실행이 안되더군요.





[+] Solution



정리하자면

1. IAT Hooking을 거는 특정 프로그램을 종료시킨다.

2. [ 위 Hooking을 거는 Process가 사용자 권한일 경우에 한함 ] 크롬을 관리자 권한으로 실행시켜 Hooking을 못 걸게 한다.

3. 크롬에 --no-sandbox 옵션을 줘서 실행한다.



정도가 되겠습니다.

해당 문제 때문에 크롬을 못쓰는 분들이 해결 하시고 잘 사용하실 수 있길 기원합니다 :D


Posted by LinkC

2010.05.28 10:55 Etc../잡담

저는 설치, 실행 모두 잘되었는데

지인이 안된다고 하더군요

크롬을 실행 시켰을 때 , 로드 중 이라는 말만 뜨고

사이트가 안뜨는 상황입니다

IE Tab으로는 열어지던데 왜 안되나 했죠

뭐 동기화 문제라는둥.. 악성코드 문제 일수도 있다는 둥

여러가지 설이 있었지만

명확히 답을 제시해주는 곳은 못찾았습니다

그때 발견한데 이 동영상인데요




확대해서 보시면 아시겠지만

크롬 등록정보에 가셔서

-no-sandbox 를 추가해주시면 됩니다



sandbox 가 뭔고 하니

Java 가 지원하는 기본 보안 소프트웨어 더군요

외부에서 받은 프로그램을 자바 가상 머신 [ Java Virtual Machine ]  , 보호 영역에 가둔뒤

작동 시키는 방법이라고 하는구요

sandbox 에서 접근을 허용한 애플릿은 시스템 작업이 가능하지만,

그렇지 않은 경우는 로컬 파일을 읽거나 바꿀수 없게 만들어 시스템 피해를 방지한다는 거죠



이게 왜 충돌이 난지는 모르겠습니다만..

아무튼 저런 옵션을 주시면 정상적으로 보실 수 있을 겁니다 :D



* 이 방법으로도 되지 않는다면 관리자 권한으로 실행시켜주시면 될껍니다




'Etc.. > 잡담' 카테고리의 다른 글

Is Dll injection on Windows7 impossible?  (0) 2010.06.22
Hacker Space?  (1) 2010.06.14
Google Chrome Loading Problem  (4) 2010.05.28
[ Tistory ] 초대장 발급!  (5) 2010.05.26
What is QR Code?  (0) 2010.05.17
[ 해커 간담회 ]  (0) 2010.05.04
Posted by LinkC
이전버튼 1 이전버튼

블로그 이미지
LinkC

태그목록

Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

공지사항

Yesterday73
Today54
Total320,227

달력

 « |  » 2018.10
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

최근에 받은 트랙백

글 보관함


. .