보안 공부 회고록

UMASK에 대한 공부 본문

sdb: 프로젝트 및 보안 자료/취약점 진단 공부 기록

UMASK에 대한 공부

김 간장 2024. 1. 14. 17:37

※ 본 글에는 개인적인 의견이 포함되어 있습니다.

※ 절대 본 글의 내용만을 신뢰하고 실 서버에 적용하지 마세요.

※ 반드시 검증 검증 검증 검증 충분한 검증!!!! 후 적용하시기 바랍니다.

 


 

항상 UMASK를 계산하는 방법을 헛갈린다.

 

디렉터리와 파일의 기본 권한은 UMASK에 의해서 결정된다.

/etc/profile 등에서 UMASK 값을 설정 할 수도 있지만 계정별로 홈 디렉터리 아래의 .profile 파일 등에서 설정할 수도 있다.

 

어쨌든 UMASK를 이용해서 디렉터리와 파일의 기본 권한을 계산하는 방법은 다음과 같다.

 

if) UMASK가 022일 때

디렉터리 : 0777 - UMASK = 0777 - 022 = 0755

파일 : 0666 - UMASK = 0666 - 022 = 0644

→ 디렉터리를 생성하면 755(rwxr-xr-x) 권한을 갖게 되고 파일을 생성하면 644(rw-r--r--) 권한을 갖게 된다.

 

if) UMASK가 027일 때

디렉터리 : 0777 - UMASK = 0777 - 027 = 0750

파일 : 0666 - UMASK = 0666 - 027 = 0640

→ 디렉터리를 생성하면 권한이 750(rwxr-x---)이고 파일을 생성하면 권한이 640(rw-r-----)을 갖게 된다.

 

if) UMASK가 052일 때

디렉터리 : 0777 - UMASK = 0777 - 052 = 0725

파일 : 0666 - UMASK = 0666 - 052 = 0614

→ 디렉터리를 생성하면 권한이 725(rwx-w-r-x)이고 파일을 생성하면 권한이 614(rw---xr--)을 갖게 된다.

 

 

사실 뺄셈 연산으로 표현했지만 0777, 0666에서 UMASK 값을 빼는게 아니라 XOR 연산을 하는 것이다.

UMASK가 0022일 때를 기준으로 계산을 해보자면 다음과 같다.

 

UMASK가 0022일 때
* 가독성을 위해서 4비트별로 나눠 띄어쓰기로 구분함

[디렉터리 권한 구하기]
0777 = 0000 0111 0111 0111
0022 = 0000 0000 0010 0010

* XOR 연산 결과
0777 = 0000 0111 0111 0111
0022 = 0000 0000 0010 0010
------------------------------
0755 = 0000 0111 0101 0101


[파일 권한 구하기]
0666 = 0000 0110 0110 0110
0022 = 0000 0000 0010 0010

* XOR 연산 결과
0666 = 0000 0110 0110 0110
0022 = 0000 0000 0010 0010
------------------------------
0644 = 0000 0110 0100 0100

 

XOR 계산 방법을 보면 알겠지만 두 개의 피연산자 중 하나만의 1일 때 1을 반환하고

모두 0이거나 모두 1이면 0을 반환한다.

0 0 → 0

1 0 → 1

0 1 → 1

1 1 → 0

 

그렇기 때문에 UMASK가 027일 때, 0666 - 027 이 마이너스 값이 나오지 않는 것이다.

계산 방법은 참고로 알아두자.

XOR 연산을 이용한다는 점!

 


 

어쨌든 주요정보통신기반시설 취약점 평가기준을 보면 UMASK 022일 때 양호라고 하는데...

디렉터리는 755(rwxrw-rw-)의 권한을 갖고 파일은 644(rw-r--r--)의 권한을 갖을 때 양호라고 본다는 것이다.

 

→ 대충 눈치챘겠지만 UMASK를 022로 하라는 의미는 group과 others에게 과도한 권한을 주지 말라는 의미로 보인다.

 


 

주요정보통신기반시설 취약점 평가 기준에서는 UMASK가 022 이상이면 양호라고 하는데...

"이상"이라는 의미가 숫자 그대로만을 고려하라는 의미는 아닌 것 같다.

 

개인적인 생각으로... UMASK 022를 양호로 본다는 것은 파일 생성 권한을 기준으로 했을 때

group에게는 최소한 읽기(r) 권한만 줄 수 있고

others에게는 읽기(r) 권한만 줄 수 있다는 의미일 것으로 추측된다. 

 

하지만 단순히 숫자만 고려해서 UMASK 값을 설정하면... UMASK가 031일 때도 양호이어야 한다.

 

문제는.... UMASK가 031이면 파일을 생성할 때, 실행(x) 권한을 얻게 된다. 

디렉터리 : 0777 - 031 = 0756(rwxr-xrw-)

파일 : 0666 - 031 = 0635 (rw--wxr-x)

이건 오히려 더 취약한 상태가 되는게 아닐까..?

 

 

개인적인 생각으로는 022 "이상"이다, "미만"이다로 판단할게 아니라

각각의 자릿수를 보고 읽기 권한만 갖고 있는가로 판단을 해야할 것 같다.

 

 

그럼... 하나씩 계산을 하면서 양호한 상황을 생각해보자.

group과 others에게 줄 수 있는 권한은 딱 읽기(r)까지만이라고 가정한다.

("파일"을 생성했을 때 갖게 되는 기본 권한을 기준으로 한다. 디렉터리는 뭐...)

 

 


1. group 혹은 others가 파일 생성 시 읽기, 쓰기 권한을 얻는 경우 (개인적으로 취약한 경우라고 판단됨)

(1-1) 처음 디렉터리를 생성할 때, group에게 읽기(r)와 쓰기(w) 권한만 주려면 UMASK의 값은 어떻게 되어야 할까?

→ UMASK 값의 10의 자리는 1이 되어야 한다.

(1-2) 처음 파일을 생성할 때, group에게 읽기(r)와 쓰기(w) 권한만 주려면 UMASK의 값은 어떻게 되어야 할까?

→ UMASK 값의 10의 자리는 0이 되어야 한다.

 

2. group 혹은 others가 파일 생성 시 읽기 권한을 얻는 경우 (개인적으로 양호라고 판단됨)

(2-1) 처음 디렉터리를 생성할 때, group에게 읽기(r) 권한만 주려면 UMASK의 값은 어떻게 되어야 할까?

→ UMASK 값의 10의 자리는 3이 되어야 한다.

(2-2) 처음 파일을 생성할 때, group에게 읽기(r) 권한만 주려면 UMASK의 값은 어떻게 되어야 할까?

→ UMASK 값의 10의 자리는 2이 되어야 한다.

* 그럼 UMASK 값의 10의 자리는 2일 때 양호로 볼 수 있어 보인다.

 

3. group 혹은 others가 파일 생성 시 쓰기 권한을 얻는 경우 (개인적으로 취약이라고 판단됨)

(3-1) 처음 디렉터리를 생성할 때, group에게 쓰기(w) 권한만 주려면 UMASK의 값은 어떻게 되어야 할까?

→ UMASK 값의 10의 자리는 5가 되어야 한다.

(3-2) 처음 파일을 생성할 때, group에게 쓰기(w) 권한만 주려면 UMASK의 값은 어떻게 되어야 할까?

→ UMASK 값의 10의 자리는 4가 되어야 한다.

 

4. group 혹은 others가 파일 생성 시 어떠한 권한도 얻지 않는 경우 (개인적으로 양호라고 판단됨)

(4-1) 처음 디렉터리를 생성할 때, group에게 그 어떠한 권한도 주지 않으려면 UMASK의 값은 어떻게 되어야 할까?

→ UMASK 값의 10의 자리는 7이 되어야 한다.

(4-2) 처음 파일을 생성할 때, group에게 그 어떠한 권한도 주지 않으려면 UMASK의 값은 어떻게 되어야 할까?

→ UMASK 값의 10의 자리는 6이 되어야 한다.

* 그럼 UMASK 값의 10의 자리는 6일 때 양호로 볼 수 있어 보인다.


 

즉, UMASK의 10의 자리는 2 혹은 6일 때만 양호가 될 수 있다. (= group에게 줄 수 있는 권한이 read 뿐이거나 아무것도 없을 때)

 

others의 권한도 마찬가지이다.

UMASK의 1의 자리는 2 혹은 6일 때만 양호가 될 수 있다. (= others에게 줄 수 있는 권한이 read 뿐이거나 아무것도 없을 때)

 

 

물론...

UMASK의 10의 자리를 6로 하게 되면 디렉터리를 생성할 때 실행 권한을 얻게 된다.

0777 - 066 = 0711 (rwx--x--x)

하지만 이건 022로 설정했을 때도 얻게 되는 권한이라서 크게 문제가 될 것 같아보이지 않는다.

 

 

마찬가지로 UMASK의 10의 자리가 4이면 일단 파일 생성 시 쓰기(w) 권한을 얻게 되는건 둘째치고 디렉터리를 만들 때 쓰기(w)와 실행(x) 권한을 얻게 되어 버린다.

 

주요정보통신기반시설 취약점 진단기준에서는 022를 양호의 기준으로 잡았고

022는 디렉터리를 만들 때 읽기(r)와 실행(x) 권한만 주는 것이었는데, UMASK의 10의 자리에 4가 들어가면 기준에 반(反)하여 쓰기(w) 권한을 넣어버리게 되는 것이다.

 

그래서 개인적인 생각으로는 UMASK의 값을 설정할 때 2 혹은 6~7이 들어가면 주요정보통신기반시설 취약점 진단 기준에 따라 잘 설정했다고 볼 수 있지 않을까 싶다.

그러니까 022, 026, 027, 062, 066, 067, 072, 076, 077만 넣는게 안전해 보인다...랄까.