프로그래머가 아닌 IT 담당자에게 설명할 수 있는 사람이 있습니까?보장하다?
예: "xterm"과 같은 프로그램이 있습니다. 스테이킹을 어떻게 더 안전하게 만들 수 있나요? 프로그램 코드 내부에 있습니까, 아니면 운영 체제 자체 외부에 있습니까?
약속은 어디에 있나요? 프로그램 코드에 있나요? 아니면 운영 체제에 xy 시스템 호출만 호출할 수 있는 바이너리 목록이 있습니까?
답변1
서약이란 무엇입니까?
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
다음에서 제공됩니다.cat.c
........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
err(1, "pledge");
while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........
답변2
프로그램은 일반적으로 특정 시스템 또는 라이브러리 호출 세트만 사용합니다. pledge
허용되는 시스템 호출 세트를 이 세트로만 제한할 수 있습니다 . 예를 들어, 프로그램이 비밀번호 데이터베이스를 읽을 필요가 없다면 이 getpwnam()
함수 호출을 방지할 수 있습니다.
무슨 소용이 있나요? 이는 취약점에 대한 추가 방어선입니다. 프로그램에 버그가 있는 경우 누군가가 버그를 악용하여 프로그램의 실행 흐름을 변경하거나 일부 추가 코드를 프로세스에 삽입할 수 있습니다. 예를 들어, 버그는 네트워크 연결 데몬의 버퍼 오버플로 버그일 수 있으며, 공격자는 프로그램이 처리할 수 있는 것보다 더 많은 데이터를 프로그램에 전송하여 트리거할 수 있으며, 프로그램이 네트워크를 통해 파일 내용을 읽고 보내도록 조정할 수 있습니다 /etc/passwd
. 회로망.
답변3
귀하의 프로그램은 {A,B,C} 함수만 사용하겠다고 "약속"합니다.
해커가 커밋된 프로세스에 코드를 삽입하고 기능 D를 시도하면 운영 체제가 프로그램을 중단시킬 수 있습니다.
예를 들어 NTP 서버가 있다고 가정합니다. DNS 및 CLOCK 기능만 사용할 것을 약속합니다. 하지만 원격 코드 실행을 허용하는 결함이 있습니다. 해커는 파일에 쓰도록 요청했습니다. 하지만 pledge
이를 감지하고 프로그램을 닫고 오류를 기록합니다.