일부 동작을 시뮬레이트하려면 프로브를 시스템 콜에 연결하고 특정 매개 변수가 전달 될 때 리턴 값을 수정하고 싶습니다. 또는 함수가 처리되기 전에 함수의 매개 변수를 수정하는 것만으로도 충분합니다.eBPF는 시스템 콜의 리턴 값이나 파라미터를 수정할 수 있습니까?
BPF에서도 가능합니까?
일부 동작을 시뮬레이트하려면 프로브를 시스템 콜에 연결하고 특정 매개 변수가 전달 될 때 리턴 값을 수정하고 싶습니다. 또는 함수가 처리되기 전에 함수의 매개 변수를 수정하는 것만으로도 충분합니다.eBPF는 시스템 콜의 리턴 값이나 파라미터를 수정할 수 있습니까?
BPF에서도 가능합니까?
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에서도이 사실을 확인했습니다.
커널 프로브 (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
사소한 수정 : seccomp는 BPF의 "클래식"버전 만 지원합니다. 현재 ** e ** BPF ("확장 BPF")에 대한 지원은 없습니다. – Qeole
업데이트 됨! 고맙습니다 Qeole. –
SystemTap의 그것에게 – fche
을 할 수는 패킷을 일부 제어 할 수 있습니다 XDP있다. [Forwarding example] (https://github.com/torvalds/linux/blob/master/samples/bpf/xdp_redirect_kern.c) –