본문 바로가기

IT

[SMACK] 쉘의 /proc/self/attr/current로 스맥권한 조종하기

파일에 rwxrwxrwx처럼 새겨진 권한만으로는 디테일한 권한설정이 어렵습니다.

소유자나 그룹의 권한을 확인하여 파일에 접근하는 종래의 방식은,

그룹 내 사용자들 간에 세부적인 권한설정이 어려웠지요.

이를 위해서는 그룹을 세세히 쪼개 관리해야했죠.


하지만, SMACK을 사용하여 상황이 나아졌습니다.

스맥 코드는 커널소스에 추가되기 때문에,

커널이 프로세스가 가진 실행권한을 분석하며 파일 'label'에 대한 접근권한이 있는지 '추가'로 체크하게 됩니다.


리눅스 권한과 스맥 권한 두 가지를 모두 통과해야 비로소 파일에 대한 접근이 허용되죠.



SMACK 환경에서는,

모든 프로세스/파일이 스맥 label을 갖고 있습니다.


* SMACK 원리

- 프로세스 : Subject, 프로세스에는 실행권한 Label이 새겨집니다.

- 파일 : Object, 파일에는 접근권한 Label이 새겨집니다.

          프로세스는 파일이기도 하기에 실행권한/접근권한 Label이 모두 새겨지죠.

- 룰 : 프로세스(Subject)의 Label과 파일(Object)의 Label의 권한관계가 명시됩니다.

       권한관계에는 r,w,x,a,t,l 등이 있습니다.

       프로세스가 파일에 접근하기 위해서는 반드시 관련 룰이 추가가 되어야 합니다.


프로세스가 파일에 접근을 하려하면,

커널은 프로세스가 가진 실행권한 Lable을 가져옵니다.

그리고 파일의 접근권한 Label도 가져오죠.

룰에서 실행권한 Label과 접근권한 Label을 찾습니다.

만약 프로세스에게 파일에 지정된 스맥권한이 없다면,

커널에 의해 접근을 거부당하게 됩니다.


체크해야할 권한이 하나 더 늘어났다는 것은,

프로세스입장에서는 가져야할 권한이 하나 더 늘어났다는 것을 의미합니다.

자신이 접근하는 '모든' 파일의 스맥권한을 확인하여,

프로세스의 접근가능 스맥리스트, 룰에 필요한 접근권한 '모두'를 추가해줘야합니다.

그렇지 않으면 프로세스가 제대로 실행되지 않을 수 있습니다.

특정 파일에 접근할 때 Access denied 되어 튕겨나오게 됩니다.


이와 마찬가지로 쉘에서 무언가 실행하고자 할때도 스맥 권한이 필요합니다.

쉘 자체도 프로세스로 동작하는 것이니,

쉘이 갖고 있는 실행권한에 따라 프로세스 런칭 여부가 결정되겠지요.


만약 쉘이 root로 떠 있다면,

스맥설정상태에 따라 모든 스맥 권한을 통과할 수 있습니다.

(사실 root도 스맥 설정에 따라 스맥권한이 없으면 실행 못할 수 있습니다.)


하지만, root가 아닌 사용자계정으로 쉘을 사용하고 있다면,

쉘이 명령어를 실행할 수 있도록 쉘에 스맥권한을 줄 필요가 있습니다.


예를 들어, /usr/bin/gdb를 사용한다고 해보죠.

gdb는 "gdb"라는 스맥실행권한을 갖고 있고요.

쉘에서 gdb를 실행하려면,

- 쉘이 gdb와 동일한 스맥실행권한으로 되어 있거나,

- 쉘이 "gdb"라는 스맥권한에 접근할 수 있도록 쉘의 룰에 "gdb"를 추가해야겠지요?


룰에 접근권한을 추가하는 방법은 차후에 공유하도록 하겠습니다.

여기서는 간단하게 쉘의 스맥권한을 변경하도록 하겠습니다.

쉘의 스맥권한을 변경하려면,

/proc/self/attr/current 값을 변경해야 합니다.

우선 /proc/self에 대해 살펴볼까요?


/proc/self

    This directory refers to the process accessing the /proc

    filesystem, and is identical to the /proc directory named by

    the process ID of the same process.


/proc/self는 말 그대로 자신을 의미합니다.

프로세스는 자신의 pid를 몰라도 /proc/self를 통해 자기 pid의 상태를 알 수 있습니다.

쉘도 프로세스이기 때문에 /proc/self로 쉘 자신의 상태를 살펴볼 수 있습니다.


/proc/[pid]/attr

    The files in this directory provide an API for security

    modules.  The contents of this directory are files that can be

    read and written in order to set security-related attributes.

    This directory was added to support SELinux, but the intention

    was that the API be general enough to support other security

    modules.  For the purpose of explanation, examples of how

    SELinux uses these files are provided below.

    This directory is present only if the kernel was configured

    with CONFIG_SECURITY.


/proc/self/attr에는 자기 프로세스와 관련된 보안정보가 담겨 있습니다.

attr 디렉토리에 담겨있는 파일들은 각각의 역할이 있지요.


$ ls -al /proc/self/attr
합계 0
dr-xr-xr-x 2 user user 0  6월 10 16:29 .
dr-xr-xr-x 9 user user 0  6월 10 16:29 ..
-rw-rw-rw- 1 user user 0  6월 10 16:29 current
-rw-rw-rw- 1 user user 0  6월 10 16:29 exec
-rw-rw-rw- 1 user user 0  6월 10 16:29 fscreate
-rw-rw-rw- 1 user user 0  6월 10 16:29 keycreate
-r--r--r-- 1 user user 0  6월 10 16:29 prev
-rw-rw-rw- 1 user user 0  6월 10 16:29 sockcreate


그 중에서 우리는 current에 주목해야겠지요.

/proc/self/attr/current에는 현재 프로세스가 가지고 있는 스맥실행권한이 명시되어 있습니다.

쉘에서 echo /proc/self/attr/current를 실행하면,

프로세스로서의 쉘이 가지고 있는 스맥실행권한을 알 수 있습니다.


위의 값을 변경한다면,

쉘의 스맥실행권한도 바뀌게 되는 것이죠.

그리고 실행하고자 하는 커맨드와 동일한 스맥실행권한을 설정한다면,

쉘에서도 커맨드명령을 탈없이 실행할 수 있게됩니다.

그렇지 않으면, 쉘에서 도무지 앱을 실행할 수 없는 이상한 경험을 하게 될 겁니다.


# echo "gdb" > /proc/self/attr/current


위와 같은 방법으로 쉘의 스맥실행권한을 변경해보세요.

스맥을 사용하는 환경에서,

쉘이 프로세스의 스맥실행권한을 가져야한다는 것을 기억해두세요. :)


끝_


* SMACK에 대한 이야기를 쌓아본다

http://storycompiler.tistory.com/51


* References

https://wiki.tizen.org/wiki/Security:Smack#Why_does_.22echo_label_.3E_.2Fproc.2Fself.2Fattr.2Fcurrent.22_change_the_current_process_label_instead_of_the_label_of_the_echo_command.3F

http://man7.org/linux/man-pages/man5/proc.5.html

http://www.apacheweek.gamma.ru/docs/manuals/enterprise/RHEL-4-Manual/en-US/Reference_Guide/s3-proc-self.html