잠시 짬을 내어서 김광태님께서 보여주신 application에 대해 생각을 해보았습니다.
다음과 같은 문제가 발생할수 있을것 같습니다.
- ISR에서 interrupt 처리를 위해 handler task를 ready 상태로 만들어버릴수 있다.
- 그렇게 되지 않는다면 interrupt 처리 task가 수행되지 못해 interrupt 관련 문제가 생길수 있다.
- Multi-core에서는 다른 core에서 event를 발생 시켜버릴수 있다.
++ 각 core의 ready queue가 틀릴때 한쪽 core에 있는 task만 처리했을 경우
++ 두 core를 동시에 정지 못시키고 suspend 상태로 만들 경우
- Multi-core에서 다른 core에서 어떠한 task가 interrupt disable 상태에서 spin lock 안에 spin을 돌고 있을 경우에는 어떻게 처리할것인가??? (다른 core를 멈추게 하는 방법에 따라 이것도 문제가 있을수 있을듯)
모두를 한꺼번에 빼고 넣는다는 걸 가정하고
일단 지금 생각 나는것은 이정도인것 같습니다.
2가지 문제로 요약될것 같습니다.
- interrupt 처리와 관련된 문제
- multi-core와 관련된 문제
OS를 만드는데 있어서 정말 심각하게 고민해봐야 되는 문제중에 하나가
suspend state를 넣느냐 마냐 입니다.
전제 :
"OS는 한치의 모호성도 용납 안되며 발생할수 있는 모든 가능성에 대해 정해진 순서대로 동작해야 한다."
완벽하게 동작하는 OS에 있어서 suspend state는 전혀 필요하지 않습니다.
미리 정해진 순서에 따라 동작하는 OS 내부에 있어서 suspend state는
그 자체로써 예외를 만들어 OS 내부의 state를 모호하게 바꾸어 버릴수 있습니다.
특히나 suspend state를 user가 변경 가능하게 제공된다면
심각한 위험성을 내포하고 있는거나 마찬가지입니다.
윈도우즈에서 user가 suspend state로 변경 가능한지 모르겠는데
그걸 떠나 전 윈도우즈에 왜 suspend state가 들어가 있는지 잘 모르겠네요.
어떻게 발생할수 있는 여러 문제들을 땜빵으로 넘어간다고 할지라도
잠재된 모든 문제들을 파악하고 해결하는건 무척 어려울것 같습니다.
다음과 같은 문제가 발생할수 있을것 같습니다.
- ISR에서 interrupt 처리를 위해 handler task를 ready 상태로 만들어버릴수 있다.
- 그렇게 되지 않는다면 interrupt 처리 task가 수행되지 못해 interrupt 관련 문제가 생길수 있다.
- Multi-core에서는 다른 core에서 event를 발생 시켜버릴수 있다.
++ 각 core의 ready queue가 틀릴때 한쪽 core에 있는 task만 처리했을 경우
++ 두 core를 동시에 정지 못시키고 suspend 상태로 만들 경우
- Multi-core에서 다른 core에서 어떠한 task가 interrupt disable 상태에서 spin lock 안에 spin을 돌고 있을 경우에는 어떻게 처리할것인가??? (다른 core를 멈추게 하는 방법에 따라 이것도 문제가 있을수 있을듯)
모두를 한꺼번에 빼고 넣는다는 걸 가정하고
일단 지금 생각 나는것은 이정도인것 같습니다.
2가지 문제로 요약될것 같습니다.
- interrupt 처리와 관련된 문제
- multi-core와 관련된 문제
OS를 만드는데 있어서 정말 심각하게 고민해봐야 되는 문제중에 하나가
suspend state를 넣느냐 마냐 입니다.
전제 :
"OS는 한치의 모호성도 용납 안되며 발생할수 있는 모든 가능성에 대해 정해진 순서대로 동작해야 한다."
완벽하게 동작하는 OS에 있어서 suspend state는 전혀 필요하지 않습니다.
미리 정해진 순서에 따라 동작하는 OS 내부에 있어서 suspend state는
그 자체로써 예외를 만들어 OS 내부의 state를 모호하게 바꾸어 버릴수 있습니다.
특히나 suspend state를 user가 변경 가능하게 제공된다면
심각한 위험성을 내포하고 있는거나 마찬가지입니다.
윈도우즈에서 user가 suspend state로 변경 가능한지 모르겠는데
그걸 떠나 전 윈도우즈에 왜 suspend state가 들어가 있는지 잘 모르겠네요.
어떻게 발생할수 있는 여러 문제들을 땜빵으로 넘어간다고 할지라도
잠재된 모든 문제들을 파악하고 해결하는건 무척 어려울것 같습니다.
댓글 9
-
김광태
2008.04.20 15:09
-
김광태
2008.04.23 23:25
글구 한가지 질문이 있는데요.. 창우씨가 이야기하는 OS의 suspend state가 OS자체의 suspend인건가요? 제가 이야기 했던건 Process 또는 Thread의 suspend였는데요..
리눅스에서도 suspend/resume thread를 지원하지 않나요? -
백창우
2008.04.24 01:05
아네. 제가 윗글에서 제대로 설명을 못했나보네요.
process의 suspend state를 이야기 한겁니다.
리눅스에서는 suspend/resume을 지원하지 않습니다.
비슷한 상태가 있긴한데 TASK_STOPPED라고,,,
이 또한 signal을 받으면 깨어납니다.
그리고 TASK_STOPPED state는 user가 임의대로 바꾸는게 아니라
kernel 내부에서 문제가 안생기는 상황에서 임시적으로 바뀌고요.
suspend state가 실제로 task state로 존재하고 suspend/resume이
API 차원에서 제공되는 OS와는 차원이 다르다고 말씀드릴수 있겠네요.
개념없는 RTOS의 경우 suspend state가 존재하는 경우가 있는데
이 때문에 골치 아픈 경우가 많이 생깁니다.
예전에 폰을 만드는 친구가 외국에서 만든 RTOS를 사용하다가 연락이 왔었는데 OS 자체에서 suspend를 잘못 사용해서 문제가 발생한 경우도 있었습니다.
결국 제가 보기엔 설계 미스라서 수정하는법을 가르쳐 주었는데
왠만하면 딴 OS 쓰라고 이야기 했던 기억도 납니다.
그나저나 정말 대단하신것 같습니다.
Windows kernel을 마음껏 뜯어 보시고, 고치실수도 있다니요.
언제한번 윈도우즈 kernel에 대한 세미나 날짜를 잡았으면 합니다.
그동안 세미나 다니면서 하셨던 내용으로 하면 될것 같습니다.
윈도우즈 kernel에 대해서 저는 김광태님의 반에 반만큼만 알아도 좋을것 같습니다. ㅜㅜ -
김광태
2008.04.24 10:08
음.. 그렇군요.. 제가 윈도우쪽만 있다보니.. Suspend/Resume Thread가 당연하다는 선입견이 있었던거 같네요.. 역시 우물안에 개구리라능...T.T
윈도우에서도 Suspend Thread에 대한 논란은 많은 상황이고 또한 아주 조심스럽게 써야 한다는 아주 많은 Document들이 있는것도 사실입니다. 하지만 그 많은 위험성을 제가 느껴보고 정확히 알아야 겠다는 욕심이었고.. 만약 가능하다면 악성코드를 Suspend 시켜 막아보려 했던 것이죠...
악성코드를 막는데 왜 굳이 Suspend를 사용하느냐고 물으신다면.. 많은 악성코드(바이러스를 포함한)는 대개 자기 자신을 보호 하는 코드를 가지고 있습니다. 종료시키거나 디버깅을 하려하면 제어를 하는거죠.. 하지만 그런 악성코드들이 그닥 신경쓰지 않는것이 Suspend 입니다. 실제로 AV업체들이나 개발자들이 싫어하는 까다로운 방법이기 때문이죠.. 하지만 만약 문제점들을 제거할 수 있다면 많은 이점이 있을수 있습니다. 프로세스를 Terminate시키는것과는 다르게 Suspend는 해당 프로세스가 알아차리지 못하는 상태에서 처리가 가능합니다. 물론 해당 바이러스가 Suspend를 감시 하겠다고 맘먹고 들면 못할것도 없지만 보통의 경우에 그렇다는 것이지요...
실예로 바이러스(루트킷) 중 자신을 은폐시키기 위해서 Windows가 가지고 있는 Thread Scheduler에서 빠져나와 Timer Interrupt를 따로 제어하거나 하는 방법으로 Thread Scheduler를 직접 만들어 돌리는 케이스도 있습니다. OS가 가지고 있는 Thread Scheduler에서 아무리 뒤져보아도 해당 Thread는 보이지가 않는것이지요.. 물론 프로세스도 확인할 수 없구요.. 이런경우에는 Suspend를 시킨다는것도 무의미 해지죠.. 그래서 Hypervisor에서 이러한 것을 잡아내는것을 시도 하고 있는것이고요... VT-x의 경우 mov to CR3 instruction이 일어나면 VMExit로 빠져나와 현재 register를 확인하여 실행되고 있는 실제 프로세스 또는 Thread를 확인할 수 있죠.. -
김광태
2008.04.24 10:10
다시 본론으로 들어가서 Suspend Thread를 사용하려 했던것은 대부분의 바이러스가 자신이 잠시 Suspend 되는것은 신경쓰지 않기 때문에 Suspend상태로 만들어 놓고 Terminate를 시키면 Terminate시에 자신을 복제 한다던지 은폐한다던지 등등의 바이러스가 자신을 보호하려는 코드를 미처 실행시키지 못하게 할 수 있다는 단순한 생각에서 나온것입니다. -
김광태
2008.04.24 10:58
글구 윈도우 커널 세미나 라니요.. 저는 한참 부족합니다.T,.T 잘하시는분께 부탁을 해볼수는 있죠.. 우리회사에 마침 "Windows 구조와 원리" 를 쓰신분이 있기는 한데 함 부탁해 볼까요? -
백창우
2008.04.24 13:54
tick handler를 고쳐 자신만의 scheduler를 집어 넣는다는데 대해서 참 대단한 집념이라는 생각이 듭니다. 그리고 그걸 잡아야 되는 입장이시니 골치가 많이 아프실것 같습니다.
갑자기 독도룡뇽과 가터 얼룩뱀의 싸움이 생각나네요.
북미에 독도룡뇽이 서식하는데 이 녀석의 피부에는 성인 100명을 죽일 정도의 맹독을 가지고 있습니다. 이렇게 독이 강해진 원인은 유일한 천적은 가터 얼룩뱀으로부터 자신을 보호하기 위해서인데 아주 오랜 옛날에는 독이 지금처럼 강하지 않았습니다.
자신을 얼룩뱀으로 부터 지키기 위해 독성분을 조금 높이니깐 얼룩뱀이 면역력을 갖게됐고, 또 올리니깐 또 면역력을 갖게되고 그런식으로 수천년 진화의 과정을 거치면서 엄청난 독을 가지게 되었습니다.
가터 얼룩뱀도 엄청난 면역력을 가지게 되었고요. 지금도 독도룡뇽의 유일한 천적은 가터 얼룩뱀인데 이제는 둘다 한계까지 왔습니다.
독도룡뇽은 체내의 거의 모든 에너지를 독을 합성하는데 쓰고, 가터 얼룩뱀은 독도룡뇽을 잡아먹고 30분간 말 그대로 "졸도"를 합니다.
갑자기 너무 잘어울리는 이야기란 생각이 들었습니다. ㅋㅋ
세미나는 김광태님이 해주시면 더욱 좋을것 같습니다. 말씀은 그리하셔도 그분보다 더 잘하실거라 생각하고 있습니다. :)
-
김광태
2008.04.24 14:05
오 정말 좋은 비유이네요... 현재 보안업계는 독도룡뇽이 완승을 하고 있는 중인것만 빼면요..^^;; 글구 솔직하게 그분이 더 잘 하십니다.. 하지만 세미나는 제가 할수 있는 부분을 할수는 있을듯 합니다. ^_^;; 노력해 보겠습니다. -
정성욱
2008.05.06 17:19
와 윈도우즈 세미나 기대됩니다.
.
현재 Windows Kernel은 thread에 대한 NtSuspendThread, NtResumeThread를 제공합니다. Process를 Suspend할때는 Process가 가지고 있는 모든 Thread를 Suspend하는 방법으로 하는건 당연한 이야기 겠죠..
NtSuspendThread이 Kernel에서 동작할때 Critical Region을 locking하고 suspend를 시도하는데요.. Kernel에서 제공하고 있는 함수 이니만큼 OS동작에 대한 어느정도의 고려가 되어 있는것은 사실인데요.. 음 이건 제가 말씀 드렸듯이 아직 검증되지 못한것은 사실입니다. 하지만 불가능하진 않다는것으로 접근하는 중입니다만.. 현재 몇가지 테스트를 통해 kernel에서 interrupt를 처리하는 상황에서의 문제라던가 spin lock등은 안전하다는것은 어느정도 테스트 결과에서 보실수 있습니다. 하지만 멀티코어라든지.. 말씀해 주신 부분들은 충분히 검증을 다시 해봐야 하겠네요..
악성행위를 하는 코드에 대한 방어책으로 Suspend는 여러가지로 유용하게 사용되어 질수 있을것이라는 아이디어로 출발 한것인데요.. 언제 한번 윈도우가 제공하고 있는 Thread suspend에 대한 코드를 가지고 이야기를 나누어 보는것도 재미있겠네요...