답변:
서약이란 무엇입니까?
pledge
시스템 호출입니다.
pledge
프로그램 호출 은 프로그램이 특정 리소스 만 사용하도록 약속하는 것입니다.
또 다른 방법은 프로그램의 작동을 필요에 따라 제한하는 것입니다.
"나는 제외한 다른 포트를 사용하지 않을 것을 서약
port 63
"
나는 이외의 다른 시스템 호출을 사용하지 않는 약속 "lseek()
및fork()
"
프로그램을보다 안전하게 만드는 방법은 무엇입니까?
프로그램 작동을 제한합니다. 예:
xyz
만 필요한 프로그램을 작성했습니다 read
.pledge
용도로만 사용하도록 추가 합니다 read
.root
쉘을 호출 할 수있는 취약점이 있음을 알게되었습니다 .root
쉘 을 열면 커널이 프로세스를 죽이고 SIGABRT
(포착 / 무시할 수 없음) 로그를 생성합니다 (로 찾을 수 있음 dmesg
).프로그램의 다른 코드를 실행하기 전에 먼저 시스템 호출 pledge
이외의 다른 것을 사용하지 않기 때문에 발생 read
합니다. 그러나 root
셸을 여는 것은 이미 다른 것을 사용하지 않기로 약속했기 때문에 금지되는 다른 시스템 호출을 여러 번 호출합니다 read
.
서약은 어디에 있습니까?
일반적으로 프로그램에 있습니다. OpenBSD 6.5 매뉴얼 페이지 에서의 사용법 :
#include <unistd.h>
int pledge(const char *promises, const char *execpromises);
예제 코드 : cat.c 의 cat
명령 코드 예제
........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
err(1, "pledge");
while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........
프로그램은 일반적으로 특정 시스템 또는 라이브러리 호출 세트 만 사용합니다. 함께 pledge
당신 만이 세트에 허용 된 시스템 호출의 집합을 제한 할 수 있습니다. 예를 들어, 프로그램이 비밀번호 데이터베이스를 읽을 필요가없는 경우 getpwnam()
함수 호출을 금지 할 수 있습니다 .
이것이 어떻게 유용합니까? 취약점에 대한 추가적인 방어선입니다. 프로그램에 버그가 포함 된 경우 누군가 버그를 악용하여 프로그램의 실행 흐름을 변경하거나 프로세스에 추가 코드를 삽입 할 수 있습니다. 예를 들어, 버그는 네트워크 페이싱 데몬의 버퍼 오버플로 오류 일 수 있습니다. 침입자는 처리 할 수있는 것보다 많은 데이터를 프로그램으로 보내 트리거 할 수 있습니다 /etc/passwd
. 회로망.