OpenBSD 6.0부터 W^X 적용이 시행됩니다.
이 규칙을 위반하기 위해 권한이 필요한 바이너리는 ld 명령을 사용하여 표시할 수 있습니다.
ld -zwxneeded에 의해 설정된 WX_OPENBSD_WXNEEDED 플래그를 기반으로 execve(2) 시간에 W^X 태그가 지정된 바이너리를 인식합니다.
나는 시도했다:
ld -b <binary> -zwxneeded
ld <binary> -zwxneeded
# ld -b sbcl -zwxneeded
ld: no input files
# ld sbcl -zwxneeded
sbcl: could not read symbols: File format not recognized
ld 매뉴얼 페이지를 읽었지만 파일 I/O에 필요한 플래그를 설정하기 위한 올바른 구문을 찾을 수 없습니다. 어떤 도움이나 조언이라도 대단히 감사하겠습니다.
답변1
openBSD 업그레이드 가이드를 다시 읽은 후 fstab에서 파일 시스템 마운트 옵션을 조정해야 한다는 답을 찾았습니다.
wxallowed 마운트 옵션. W^X는 이제 기본적으로 엄격하게 적용됩니다. 프로그램은 wxallowed mount(8) 옵션으로 마운트된 파일 시스템에 있는 경우에만 이를 위반할 수 있습니다. /usr/local이 별도의 파일 시스템인 한 이는 기본 시스템을 더욱 안전하게 만듭니다.
기본 시스템에는 W^X를 위반하는 프로그램이 없지만 포트 트리에는 chromium, mono, node, gnome, libreoffice, jdk, zeal 등 꽤 많은 프로그램이 포함되어 있습니다. 이러한 포트를 정기적으로 실행하려면 fstab(5)의 /usr/local에 대한 마운트 옵션에 wxallowed를 추가해야 합니다. 예를 들면 다음과 같습니다.
01020304050607.h /usr/local ffs rw,nodev,wxallowed 1 2
작은 디스크에는 별도의 /usr/local 파티션이 없을 수 있습니다. 이 경우 wxallowed를 포함하는 가장 작은 파티션(/usr 또는 /)에 추가하십시오.
wxallowed 마운트 옵션 없이 파티션에서 W^X를 위반하는 프로그램을 시작하면 코어 덤프가 생성되고 dmesg(8)에는 soffice.bin(15529): mprotect W^X 위반과 같은 항목이 포함됩니다. mount -uo wxallowed /usr/local을 실행하여 W^X 위반 포트를 일시적으로 허용할 수 있습니다.