Я хочу перехватить cudaSetDevice с помощью хука (LD_PRELOAD) и изменить идентификатор устройства. После успешного угона отправка задачи GPU будет неправильной.
Я попытался перехватить функцию cuCtxCreate в API-интерфейсе драйвера, но не смог. Тот же метод перехватывает функцию cuDevicePrimaryCtxRetain, которую можно перехватить, и при изменении идентификатора устройства возникнет ошибка.
// cuda 9.0 cuda runtime api
typedef int(*cuda_set_device_fp)(int);
// define dynamic library same name function
int cudaSetDevice(int device)
{
static void *handle = NULL;
static cuda_set_device_fp orig_cuda_set_device = NULL;
if( !handle )
{
handle = dlopen("libcuda.so", RTLD_LAZY);
orig_cuda_set_device = (cuda_set_device_fp)dlsym(handle, "cudaSetDevice");
}
device = 1;
printf("oops!!! hack function invoked. device = %d\n", device);
return cudaSetDevice(device);
}
Взлом выполняется успешно, пользователь сопоставляется с задачей GPU на устройстве 0 и повторно сопоставляется с устройством 1.