/proc/pid/stat를 공백으로 분할하면 어떤 단점이 있나요?

/proc/pid/stat를 공백으로 분할하면 어떤 단점이 있나요?

/proc/pid/statLinux에서 공간 분할의 단점은 무엇입니까? 예를 들어, bash하나를 사용하면 다음을 통해 세 번째 열에 액세스할 수 있습니다.

$ cat /proc/$$/stat
14198 (bash) S 14195 14198 14198 34816 ...
$ x=($(< /proc/$$/stat)); echo ${x[2]}
S
$ 

모든 게 괜찮은 것 같나요?

답변1

주요 문제는 공백 문자( 0x20)가 레코드 사이의 구분 기호로 사용되며 로컬 사용자가 프로세스 이름을 설정할 수 있는지 여부에 따라 레코드 내에 나타날 수 있다는 것입니다.

$ perl -e '$0="like this"; sleep 999' &
[1] 14343
$ 

그러면 공백으로 구문 분석 및 분할이 실패합니다.

$ x=($(< /proc/14343/stat)); echo ${x[2]}
this)
$ 

명령 이름에 공백이 포함되어 있기 때문입니다.

$ cat /proc/14343/stat
14343 (like this) S 14198 14343 ...
$ 

얼마나 나쁜가요? ~에 따르면proc(5)"프로세스의 제어 터미널"이 흥미롭습니다.

          tty_nr %d   (7) The controlling terminal of the  process.   (The
                      minor  device number is contained in the combination
                      of bits 31 to 20 and 7 to 0; the major device number
                      is in bits 15 to 8.)

따라서 누군가가 해당 정보를 변경했기 때문에 잘못 구문 분석된 제어 터미널 정보를 프로세스에서 남용하는 경우 /proc/pid/stat,보안 취약점이 발생할 수 있음.

)15자 제한에도 불구하고 프로세스 이름에 a를 넣을 수 있으므로 구문 분석이 더 복잡해집니다.

$ perl -e '$0="lisp) a b c d e f g h i"; sleep 999' &
[4] 14440
$ cat /proc/14493/stat
14493 (lisp) a b c d e) S 14198 14493 14198 34816 ...
$ 

인터페이스 결함 분석을 위한 아이디어

프로세스 이름은 빈 문자열부터 15바이트까지 다양할 수 있으므로

1234 () S ...
4321 (xxxxxxxxxxxxxxx) S ...

한 가지 아이디어는 첫 번째 공간을 분할하여 pid를 얻은 다음 해당 문자열의 끝에서 거꾸로 작업하여 첫 번째 공간을 찾는 것입니다. )오른쪽의 첫 번째 공간 앞에 오는 것은 무엇이든 )프로세스 이름이어야 하며 일반 필드는 pid여야 합니다. 왼쪽. 코드를 단위 테스트하는 것이 좋습니다...

답변2

생각이 필요하다면 그냥 읽어보면 어떨까요 /proc/$pid/status? 아름답게 표시된 선에 동일한 정보를 제공합니다.그리고프로세스 이름에 나타나는 개행 및 백슬래시를 이스케이프하세요.

$ perl -e '$0="foo\nbar\n"; system "head -3 /proc/$$/status";'
Name:   foo\nbar\n
Umask:  0022
State:  S (sleeping)

관련 정보