문제

LD_PRELOAD 트릭과 특정 syscall을 귀하가 제공한 것으로 대체하는 Linux 커널 모듈 외에 syscall(예: open)을 가로채서 실제 열기에 도달하기 전에 먼저 함수를 통과하도록 할 수 있습니까?

도움이 되었습니까?

해결책

솔루션이 정말로 필요한 경우 이를 수행하는 DR 루트킷에 관심이 있을 수 있습니다. http://www.immunityinc.com/downloads/linux_rootkit_source.tbz2 그것에 관한 기사는 여기에 있습니다 http://www.theregister.co.uk/2008/09/04/linux_rootkit_released/

다른 팁

왜 당신은 LD_PRELOAD 트릭?

예제 코드는 다음과 같습니다.

/*
 * File: soft_atimes.c
 * Author: D.J. Capelis
 *
 * Compile:
 * gcc -fPIC -c -o soft_atimes.o soft_atimes.c
 * gcc -shared -o soft_atimes.so soft_atimes.o -ldl
 *
 * Use:
 * LD_PRELOAD="./soft_atimes.so" command
 *
 * Copyright 2007 Regents of the University of California
 */

#define _GNU_SOURCE
#include <dlfcn.h>
#define _FCNTL_H
#include <bits/fcntl.h>

extern int errorno;

int (*_open)(const char * pathname, int flags, ...);
int (*_open64)(const char * pathname, int flags, ...);

int open(const char * pathname, int flags, mode_t mode)
{
    _open = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open");
    if(flags & O_CREAT)
        return _open(pathname, flags | O_NOATIME, mode);
    else
        return _open(pathname, flags | O_NOATIME, 0);
}

int open64(const char * pathname, int flags, mode_t mode)
{
    _open64 = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open64");
    if(flags & O_CREAT)
        return _open64(pathname, flags | O_NOATIME, mode);
    else
        return _open64(pathname, flags | O_NOATIME, 0);
}

제가 이해한 바에 따르면...그것은 거의 LD_PRELOAD 트릭이나 커널 모듈입니다.함수를 트랩아웃할 수 있는 에뮬레이터에서 실행하거나 함수를 트랩아웃하기 위해 실제 바이너리에 코드를 다시 작성하지 않는 한 중간 지점은 많지 않습니다.

프로그램을 수정할 수 없고 커널을 수정할 수 없거나 수정하고 싶지 않다고 가정하면, 애플리케이션이 상당히 표준적이고 실제로 악의적으로 지나가려고 하는 애플리케이션이 아니라고 가정하면 LD_PRELOAD 접근 방식이 가장 좋습니다. 당신의 차단.(이 경우 다른 기술 중 하나가 필요합니다.)

발그린드 모든 함수 호출을 가로채는 데 사용할 수 있습니다.완성된 제품에서 시스템 호출을 가로채야 하는 경우에는 아무 소용이 없습니다.그러나 개발 중에 가로채려고 한다면 매우 유용할 수 있습니다.나는 테스트 목적으로 반환된 해시를 제어할 수 있도록 해싱 함수를 가로채기 위해 이 기술을 자주 사용했습니다.

모르는 경우 Valgrind는 주로 메모리 누수 및 기타 메모리 관련 오류를 찾는 데 사용됩니다.그러나 기본 기술은 기본적으로 x86 에뮬레이터입니다.프로그램을 에뮬레이트하고 malloc/free 등에 대한 호출을 가로챕니다.좋은 점은 사용하기 위해 다시 컴파일할 필요가 없다는 것입니다.

Valgrind에는 그들이 부르는 기능이 있습니다. 함수 래핑, 기능 차단을 제어하는 ​​데 사용됩니다.섹션 3.2를 참조하세요. Valgrind 매뉴얼 자세한 내용은.원하는 기능에 대해 기능 래핑을 설정할 수 있습니다.호출이 차단되면 제공한 대체 기능이 호출됩니다.

일부 응용 프로그램은 strace/ptrace가 실행되지 않도록 속일 수 있으므로 내가 가진 유일한 실제 옵션은 systemtap을 사용하는 것입니다.

Systemtap은 필요한 경우 와일드카드 일치로 인해 여러 시스템 호출을 가로챌 수 있습니다.Systemtap은 C가 아니라 별도의 언어입니다.기본 모드에서 systemtap은 어리석은 일을 방지해야 하지만 필요한 경우 개발자가 C를 사용할 수 있도록 하는 "전문가 모드"에서도 실행할 수 있습니다.

커널을 패치할 필요가 없으며(또는 최소한 패치하면 안 됨), 모듈이 컴파일되면 테스트/개발 상자에서 복사하여 (insmod를 통해) 프로덕션 시스템에 삽입할 수 있습니다.

나는 아직 systemtap에 걸리는 것을 피하거나 해결하는 방법을 찾은 Linux 응용 프로그램을 찾지 못했습니다.

그냥 하고 싶다면 보다 열려 있는 항목이 있으면 ptrace() 함수나 명령줄 strace 유틸리티의 소스 코드를 보고 싶을 것입니다.실제로 원한다면 가로채기 호출을 통해 다른 작업을 수행하게 하려면 나열된 옵션(LD_PRELOAD 또는 커널 모듈)이 유일한 옵션이라고 생각합니다.

LKM을 사용하여 이 작업을 우아하게 수행할 수 있는 구문은 없지만 이 문서에서는 수행해야 할 작업에 대한 좋은 개요를 제공합니다. http://www.linuxjournal.com/article/4378

sys_open 함수를 패치할 수도 있습니다.linux-2.6.26부터 file/open.c의 1084번째 줄에서 시작됩니다.

또한 새로운 시스템을 구축하지 않고도 inotify, systemtap 또는 SELinux를 사용하여 이 모든 로깅을 수행할 수 없는지 확인할 수도 있습니다.

디버깅 목적으로만 수행하려면 시스템 호출이 완료될 때 코드를 연결할 수 있는 ptrace(2) 시스템 호출 위에 내장된 strace를 살펴보십시오.매뉴얼 페이지의 PTRACE_SYSCALL 부분을 참조하십시오.

auditd가 필요한 것 같습니다.

Auditd를 사용하면 로깅을 통해 모든 시스템 호출 또는 파일 액세스를 전역적으로 추적할 수 있습니다.관심 있는 특정 이벤트에 대한 키를 설정할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top