깡다구짱 2008. 10. 3. 17:39

< define Syntax >

define은 여러 값들을 묶어 놓은 vaule형태와 define함수 형태가 있다.

define함수형은 내부 인자값들을 둘 수 있고 그 인자값에 해당하는 타입에 여러 문법을 적용할 수 있으며

아래와 같이 표현된다.

define(`can_ps',`
allow $1 $2:dir { search getattr read };
allow $1 $2:{ file lnk_file } { read getattr };
allow $1 $2:process getattr;
# We need to suppress this denial because procps tries to access
# /proc/pid/environ and this now triggers a ptrace check in recent kernels
# (2.4 and 2.6).  Might want to change procps to not do this, or only if
# running in a privileged domain.
dontaudit $1 $2:process ptrace;
') 

 

다음 value형태는 classes나 permission들의 묶음을 뜻한다.

 

#
# Unprivileged socket classes (exclude rawip, netlink, packet).
#
define(`unpriv_socket_class_set', `{ tcp_socket udp_socket unix_stream_socket unix_dgram_socket }')


#
# Permissions for getting file attributes.
#
define(`stat_file_perms', `{ getattr }')

 두 define정의가 되어 있다. 하나는 클래스들에 대한 묶음이고 또 하나는 permission에 대한 묶음이다.

여기서는 getattr이라는 하나의 permission만 묶여있지만 여러개를 같이 묶을 수도 있다.

 

위의 모든 예는 macro/ core_macros.te 파일에 모두 나타나 있다

 

            Policy Information Data Parsing

 define 함수에 대한 파싱법은 간단하다. define에 대한 정의문이 먼저 나오기 때문에 define함수를 먼저 찾으면

된다. 하지만 그 define문이 함수 형태인지..아니면 value 거기다...classes의 묶음인지..permission의 묶음인지

를 구분하기가 애매했다.

 

그래서 먼저 인자값을 받는 의미인 $표시를 가진 것을 기준으로 define함수와 define value를 구분하였다.

그 다음 classes와 permission을 구분하기 위하여 define명을 참조하면 간단하겠지만..그건 말도 안되는

방법이고 가장 좋은 방법은 내부 묶여져 있는 속성들을 검사하는 것이다.

클래스와 내부 permission에 대한 정의는 ..\policy\based_policy\access_vectors파일에 나타나 있다.

뒤에서 설명할 class와 permission에 대한 정보 파일을 이용하여 해당 묶인 값이 permission에 해당하는지

아니면 class에 해당 하는지 조사해 보면 된다. 나는 permission을 기준으로 검사하였다..

 

 

많은 검색이 이루어 지기 때문에 속도가 다소 느린점이 있는데...commnet정보까지 파싱한다면

과연 노다가임에 틀림없다..ㅡ,.ㅡ