크게 다음과 같은 구조로 나눌 수 있다


main 함수

프로세스(P)가 실행되면 같은 프로세스가 중복 실행되고 있는지 확인 후 프로세스가 루트 권한인지 확인한다

프로세스 이름을 “kdmtmpflush”로 설정한다 리눅스에서 kdmflush는 디바이스 매퍼가 지연된 작업을 처리하는 데 사용되는 커널 스레드 프로세스다
정상적인 프로세스인 것처럼 위장하기 위해서 tmp라는 단어를 섞어서 프로세스명을 설정한다 변종에 따라 프로세스 이름이 다르게 지정될 수도 있다

그 후에는 공유 메모리 공간에 똑같은 프로세스를 복제하여 --init 옵션과 함께 실행한다 공유 메모리 공간은 프로세스들이 임시적으로 사용하는 공간으로 모든 사용자가 접근할 수 있는 공간이다 복제된 프로세스(P1)에 755 권한이 부여되고 실행된 후에 공유 메모리 공간에서 삭제된다

--init 옵션은 같은 프로세스가 복제되어 실행되었을 때 자가복제가 또 이루어지지 않도록 하는 역할이다 옵션명과는 상관없이 옵션이 있기만 하면 되기 때문에 변종에 따라 옵션명은 달라질 수 있다


char *self[] = {
        "/sbin/udevd -d",
        "/sbin/mingetty /dev/tty7",
        "/usr/sbin/console-kit-daemon --no-daemon",
        "hald-addon-acpi: listening on acpi kernel interface /proc/acpi/event",
        "dbus-daemon --system",
        "hald-runner",
        "pickup -l -t fifo -u",
        "avahi-daemon: chroot helper",
        "/sbin/auditd -n",
        "/usr/lib/systemd/systemd-journald"
};

현재 시스템 시간을 난수로 설정하고 10개의 문자열 중 하나를 랜덤으로 선택해 프로세스명을 변경한다 변종에 따라 문자열은 달라질 수 있다


char hash[] = {0x6a, 0x75, 0x73, 0x74, 0x66, 0x6f, 0x72, 0x66, 0x75, 0x6e, 0x00}; // justforfun
char hash2[]= {0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x00}; // socket

hashhash2 두 개의 암호가 헥스 배열로 하드코딩되어 있다 변종에 따라 암호는 달라질 수 있다

공격자가 어떤 암호를 사용하는지에 따라 BPFDoor가 수행하는 동작이 달라진다