OpenBSD의 서약은 무엇입니까? 수 있습니까 ? 서약

프로그래머가 아닌 IT 담당자를 위해 누군가가 설명 할 수 있습니까 ? 서약 이란 무엇 입니까?

예 : “xterm”과 같은 프로그램이 있습니다. 서약은 어떻게 그것을 더 안전하게 만들 수 있습니까? 프로그램 코드 내부 또는 OS 자체 외부에 서약합니까?

서약은 어디에 있습니까? 프로그램 코드에 있습니까? 또는 OS에 xy syscalls 만 호출 할 수있는 바이너리 목록이 있습니까?



답변

서약이란 무엇입니까?

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.ccat명령 코드 예제

........
#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. 회로망.


답변

귀하의 프로그램은 {A, B, C} 기능 만 사용하기로 “약속”합니다

해커가 서약 된 프로세스에 코드를 삽입하고 기능 D를 시도 할 수 있으면 OS가 프로그램을 중단시킵니다

예를 들어 NTP 서버가 있다고 가정하십시오. DNS 및 CLOCK 기능 만 사용하기로 약속했습니다. 그러나 원격 코드 실행을 허용하는 결함이 있습니다. 해커가 파일 쓰기를 요청합니다. 그러나 pledge이것을 감지하고 프로그램을 종료하고 오류를 기록합니다.


답변