Linux generic

psycho 2013. 9. 5. 23:44

※이 글은 어떻게 해서든 Windows를 사용하지 않고 Raw socket을 사용하는 Windows용 프로그램을 돌려야 하는 사용자를 위해 작성되었다. 쉬운 해결책을 원한다면 그냥 Windows를 설치하여 사용하라. 요즘에는 굳이 멀티부팅을 이용하지 않더라도 가상화 소프트웨어가 잘 되어 있다.


 OSI 7계층 중 전송 계층(Transport layer)은 계층 구조의 네트워크 구성요소와 프로토콜 내에서 송신자와 수신자를 연결하는 통신 서비스를 제공한다1. 여기에는 TCP, UDP 등 보통 통신 프로토콜로 불리는 것들이 포함되어 있다. 응용프로그램들은 미리 표준으로 정의되어 운영체제상에 구현된 이 기능들을 이용하여 서로 통신을 하게 된다. 그런데, 저수준의 동작을 필요로 하는 것들(패킷 스니퍼로부터 심지어는 ping이나 traceroute까지 포함하는)의 경우에는 이런 표준화된 기능들보다 상위에서 동작해야 하기 때문에, 이들을 위해 운영체제 수준에서 어떤 처리도 하지 않고 네트워크상에서 전송데는 데이터를 그대로 가져오는 기능이 있다. 이를 Raw socket이라 부른다. 이를 잘 이용하면 Spoofing 같은 해킹 기술부터 공격을 위해 조작된 패킷에 대한 모니터링, 심지어는 운영체제 수준에서 구현된 TCP/IP stack을 쓰지 않고 독자적으로 프로토콜을 구현하여 사용하는 것마저 가능하다.


 문제는 Linux에서 보안상의 이유로 수퍼유저 권한이 없는 프로세스에는 Raw socket을 사용하지 못하게 막아둔 데서 발생한다. 물론 다른 요인도 있지만 간단하게 말해서 왜 그런지는 패킷 스니퍼가 어떤 역할을 하는지를 생각해보면 명확해진다. 그 덕분에 Raw socket을 사용하는 Windows용 프로그램은 슈퍼유저 권한으로 실행시키지 않으면 제대로 동작하지 않는다. 그렇다고 SetUID bit 같은 걸 WINE에다가 설정하는 건 정말 어리석은 짓이다. (어떤 오동작을 할지, 그 여파가 어디까지 미칠지 장담할 수 없기 때문에)수퍼유저 권한으로 WINE을 실행시키는 행위는 엄청나게 위험한 행위라고 WINE 공식 홈페이지에도 적혀있다. 그렇다면 어찌해야 좋을까?


 물론 방법이야 있다. libcap에 포함되어 있는 프로그램을 이용하면 Linux에서 다양한 권한 설정을 할 수 있는데, 이걸로 Raw socket을 열 수 있는 권한을 줄 수 있다. 다음은 사용법이다(raw_socket.exe는 이 권한을 필요로 하는 프로그램 파일의 경로다).


localhost:~ # setcap cap_net_raw=ep raw_socket.exe


이렇게 하면 일반 사용자 권한으로 해당 프로그램을 실행시켜도 Raw socket을 사용할 수 있게 된다. 사족으로, 설정되어 있는 값을 보기 위한 명령어는 getcap이다. 설정한 값을 전부 지우려면 setcap -r 옵션을 사용하면 된다. 더 자세한 사용법은 man page를 참조하라. 이는 꼭 WINE만이 아닌, 일반적인 Linux 응용프로그램에도 똑같이 적용할 수 있다.

각주 1

http://ko.wikipedia.org/wiki/%EC%A0%84%EC%86%A1_%EA%B3%84%EC%B8%B5

  1. http://ko.wikipedia.org/wiki/%EC%A0%84%EC%86%A1_%EA%B3%84%EC%B8%B5 [본문으로]