2017-03-24 1 views
2

일부 동작을 시뮬레이트하려면 프로브를 시스템 콜에 연결하고 특정 매개 변수가 전달 될 때 리턴 값을 수정하고 싶습니다. 또는 함수가 처리되기 전에 함수의 매개 변수를 수정하는 것만으로도 충분합니다.eBPF는 시스템 콜의 리턴 값이나 파라미터를 수정할 수 있습니까?

BPF에서도 가능합니까?

+1

SystemTap의 그것에게 – fche

+0

을 할 수는 패킷을 일부 제어 할 수 있습니다 XDP있다. [Forwarding example] (https://github.com/torvalds/linux/blob/master/samples/bpf/xdp_redirect_kern.c) –

답변

2

kprobes/kretprobes에 eBPF를 첨부하면 함수 인수와 반환 값에 대한 읽기 액세스가 가능하지만 그 함수를 조작 할 수는 없다고 생각합니다. 나는 100 % 확실하지 않다; 확인을 요청할 수있는 좋은 장소는 IO Visor 프로젝트 mailing list 또는 IRC 채널 (irc.oftc.net의 #iovisor)입니다.

대체 솔루션으로 strace으로 시스템 콜의 리턴 값을 변경할 수 있다는 것을 알고 있습니다. -e 옵션이 있습니다. the manual page 인용 : 그것은 당신에게 관심의 경우

-e inject=set[:error=errno|:retval=value][:signal=sig][:when=expr] 
     Perform syscall tampering for the specified set of syscalls. 

또한, 오류 주입, FOSDEM 2017에서이 이것에 a presentation, 그리고.

strace -P precious.txt -efault=unlink:retval=0 unlink precious.txt 

편집 : 벤에 의해 언급 한 바와 같이 추적 및 사용 사례를 모니터링, eBPF이 Kprobes를하고 추적 점에 결정적으로, 읽기 전용 다음 슬라이드에서 하나 개의 예시 명령입니다. IRC에서도이 사실을 확인했습니다.

3

커널 프로브 (kprobes) 내에서 eBPF 가상 시스템은 syscall 매개 변수와 반환 값에 대한 읽기 전용 액세스 권한을가집니다.

그러나 eBPF 프로그램에는 자신의 반환 코드가 있습니다. BPF (NOT eBPF; thanks @qeole) 리턴 코드를 트랩하고 실행 중에 시스템 호출을 인터럽트하는 seccomp 프로파일을 적용 할 수 있습니다.

허용되는 런타임 변형은 : SECCOMP_RET_KILL: Immediate kill with SIGSYS SECCOMP_RET_TRAP: Send a catchable SIGSYS, giving a chance to emulate the syscall SECCOMP_RET_ERRNO: Force errno value SECCOMP_RET_TRACE: Yield decision to ptracer or set errno to -ENOSYS SECCOMP_RET_ALLOW: Allow https://www.kernel.org/doc/Documentation/prctl/seccomp_filter.txt

SECCOMP_RET_TRACE있어서 인수 나 리턴 값, 시스템 호출을 수행 수정 가능하게한다. 이는 아키텍처에 의존하며 필수 외부 참조를 수정하면 ENOSYS 오류가 발생할 수 있습니다.

추적 된 프로세스 메모리, 레지스터 및 파일 설명자를 수정할 수있는 대기중인 사용자 공간 ptrace에 실행을 전달하면됩니다.

추적 프로그램은 ptrace를 호출 한 다음 waitpid를 호출해야합니다. 예 : waitpid 반환, status의 내용에 따라, 하나는 PTRACE_GETEVENTMSG의 ptrace 작업을 사용하여 기는 seccomp 반환 값을 검색 할 수 있습니다 ptrace(PTRACE_SETOPTIONS, tracee_pid, 0, PTRACE_O_TRACESECCOMP); waitpid(tracee_pid, &status, 0); http://man7.org/linux/man-pages/man2/ptrace.2.html

. 그러면 seccomp SECCOMP_RET_DATA 값이 검색됩니다.이 값은 BPF 프로그램에서 설정 한 16 비트 필드입니다. 예 :

ptrace(PTRACE_GETEVENTMSG, tracee_pid, 0, &data);

콜 인수는 계속 작동하기 전에 메모리에 수정 될 수 있습니다. PTRACE_SYSCALL 단계를 사용하여 단일 syscall 항목을 수행하거나 종료 할 수 있습니다.실행을 다시 시작하기 전에 사용자 공간에서 Syscall 반환 값을 수정할 수 있습니다. 기본 프로그램은 syscall 반환 값이 수정 된 것을 볼 수 없습니다.

예제 구현 : 사람이 네트워킹을위한 eBPF를 사용하여 여기에 관심이 오면 Filter and Modify System Calls with seccomp and ptrace

+1

사소한 수정 : seccomp는 BPF의 "클래식"버전 만 지원합니다. 현재 ** e ** BPF ("확장 BPF")에 대한 지원은 없습니다. – Qeole

+0

업데이트 됨! 고맙습니다 Qeole. –

관련 문제