int main(int argc, char **argv) { struct NaClApp app; NaClHandleBootstrapArgs(&argc, &argv); NaClDebugExceptionHandlerStandaloneHandleArgs(argc, argv); /* Turn off buffering to aid debugging. */ setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stderr, NULL, _IONBF, 0); NaClAllModulesInit(); if (argc != 3) { NaClLog(LOG_FATAL, "Expected 2 arguments: <executable-filename> <crash-type>\n"); } g_crash_type = argv[2]; CHECK(NaClAppCtor(&app)); CHECK(NaClAppLoadFileFromFilename(&app, argv[1]) == LOAD_OK); NaClAppInitialDescriptorHookup(&app); if (TestWithUntrustedExceptionHandling()) { app.enable_exception_handling = 1; #if NACL_WINDOWS app.attach_debug_exception_handler_func = NaClDebugExceptionHandlerStandaloneAttach; #endif } NaClAddSyscall(NACL_sys_test_syscall_1, JumpToZeroCrashSyscall); NaClAddSyscall(NACL_sys_test_syscall_2, JumpIntoSandboxCrashSyscall); RegisterHandlers(); CHECK(NaClCreateMainThread(&app, argc - 1, argv + 1, NULL)); NaClWaitForMainThreadToExit(&app); NaClLog(LOG_ERROR, "We did not expect the test program to exit cleanly\n"); return 1; }
int main(int argc, char **argv) { struct NaClApp app; uint32_t mmap_addr; char arg_string[32]; char *args[] = {"prog_name", arg_string}; NaClAllModulesInit(); if (argc != 2) { NaClLog(LOG_FATAL, "Expected 1 argument: executable filename\n"); } NaClAddSyscall(NACL_sys_test_syscall_1, TestSyscall); CHECK(NaClAppCtor(&app)); CHECK(NaClAppLoadFileFromFilename(&app, argv[1]) == LOAD_OK); NaClAppInitialDescriptorHookup(&app); CHECK(NaClAppPrepareToLaunch(&app) == LOAD_OK); NaClSignalHandlerInit(); NaClSignalHandlerSet(TrapSignalHandler); /* * Allocate some space in untrusted address space. We pass the * address to the guest program so that it can write a register * snapshot for us to compare against. */ mmap_addr = NaClSysMmapIntern( &app, NULL, sizeof(*g_test_shm), NACL_ABI_PROT_READ | NACL_ABI_PROT_WRITE, NACL_ABI_MAP_PRIVATE | NACL_ABI_MAP_ANONYMOUS, -1, 0); g_test_shm = (struct RegsTestShm *) NaClUserToSys(&app, mmap_addr); SNPRINTF(arg_string, sizeof(arg_string), "0x%x", (unsigned int) mmap_addr); CHECK(NaClCreateMainThread(&app, 2, args, NULL)); CHECK(NaClWaitForMainThreadToExit(&app) == 0); CHECK(!g_in_untrusted_code); ASSERT_EQ(g_context_switch_count, (kNumberOfCallsToTest + kFastPathSyscallsToTest - 1) * 2); /* * Avoid calling exit() because it runs process-global destructors * which might break code that is running in our unjoined threads. */ NaClExit(0); return 0; }
/* * d'b: see documentation about "one ring" tonneling syscall * note: all syscalls except trap() only need for nexe prolog */ void NaClSyscallTableInit() { int i; for (i = 0; i < NACL_MAX_SYSCALLS; ++i) { nacl_syscall[i].handler = &NotImplementedDecoder; } NaClAddSyscall(Trap, &TrapDecoder); /* 0. added onering call */ NaClAddSyscall(NACL_sys_sysbrk, &NaClSysSysbrkDecoder); /* 20 */ NaClAddSyscall(NACL_sys_exit, &NaClSysExitDecoder); /* 30 */ NaClAddSyscall(NACL_sys_tls_init, &NaClSysTls_InitDecoder); /* 82 */ NaClAddSyscall(NACL_sys_tls_get, &NaClSysTls_GetDecoder); /* 84 */ NaClAddSyscall(NACL_sys_mutex_create, &NaClSysMutex_CreateDecoder); /* 70 */ }
void NaClInjectThreadCaptureSyscall(struct NaClApp *nap) { UNREFERENCED_PARAMETER(nap); NaClAddSyscall(NACL_sys_test_syscall_1, TestSyscall); }
/* d'b: in this list of system calls 5 ones left untouched: (other syscalls set to "NaClSysRestricted") syscalls for an empty nexe: "main(){}" + 20 -- NACL_sys_sysbrk (NaClSysSysbrkDecoder) -- still need to serve user malloc() ++ 30 -- NACL_sys_exit (NaClSysExitDecoder) -- no need. i gonna exit through long/short jump + 70 -- NACL_sys_mutex_create (NaClSysMutex_CreateDecoder) -- dummy + 82 -- NACL_sys_tls_init (NaClSysTls_InitDecoder) -- dummy + 84 -- NACL_sys_tls_get (NaClSysTls_GetDecoder) -- dummy special case, tonneling call: 0 -- artificially added "One Ring" single syscall note: to restore syscalls to the original version just delete everything until "d'b end" and uncomment commented code */ void NaClSyscallTableInitDisable() { int i; for (i = 0; i < NACL_MAX_SYSCALLS; ++i) { nacl_syscall[i].handler = &NotImplementedDecoder; } NaClAddSyscall(One_ring, &OneRingDecoder); /* 0. added onering call */ NaClAddSyscall(NACL_sys_null, &NaClSysRestricted); NaClAddSyscall(NACL_sys_nameservice, &NaClSysRestricted); NaClAddSyscall(NACL_sys_dup, &NaClSysRestricted); NaClAddSyscall(NACL_sys_dup2, &NaClSysRestricted); NaClAddSyscall(NACL_sys_open, &NaClSysRestricted); NaClAddSyscall(NACL_sys_close, &NaClSysRestricted); NaClAddSyscall(NACL_sys_read, &NaClSysRestricted); NaClAddSyscall(NACL_sys_write, &NaClSysRestricted); NaClAddSyscall(NACL_sys_lseek, &NaClSysRestricted); NaClAddSyscall(NACL_sys_ioctl, &NaClSysRestricted); NaClAddSyscall(NACL_sys_fstat, &NaClSysRestricted); NaClAddSyscall(NACL_sys_stat, &NaClSysRestricted); NaClAddSyscall(NACL_sys_getdents, &NaClSysRestricted); NaClAddSyscall(NACL_sys_sysbrk, &NaClSysSysbrkDecoder); /* 20 */ NaClAddSyscall(NACL_sys_mmap, &NaClSysRestricted); NaClAddSyscall(NACL_sys_munmap, &NaClSysRestricted); NaClAddSyscall(NACL_sys_exit, &NaClSysExitDecoder); /* 30 */ NaClAddSyscall(NACL_sys_getpid, &NaClSysRestricted); NaClAddSyscall(NACL_sys_thread_exit, &NaClSysRestricted); NaClAddSyscall(NACL_sys_gettimeofday, &NaClSysRestricted); NaClAddSyscall(NACL_sys_clock, &NaClSysRestricted); NaClAddSyscall(NACL_sys_nanosleep, &NaClSysRestricted); NaClAddSyscall(NACL_sys_imc_makeboundsock, &NaClSysRestricted); NaClAddSyscall(NACL_sys_imc_accept, &NaClSysRestricted); NaClAddSyscall(NACL_sys_imc_connect, &NaClSysRestricted); NaClAddSyscall(NACL_sys_imc_sendmsg, &NaClSysRestricted); NaClAddSyscall(NACL_sys_imc_recvmsg, &NaClSysRestricted); NaClAddSyscall(NACL_sys_imc_mem_obj_create, &NaClSysRestricted); NaClAddSyscall(NACL_sys_tls_init, &NaClSysTls_InitDecoder); /* 82 */ NaClAddSyscall(NACL_sys_thread_create, &NaClSysRestricted); NaClAddSyscall(NACL_sys_tls_get, &NaClSysTls_GetDecoder); /* 84 */ NaClAddSyscall(NACL_sys_thread_nice, &NaClSysRestricted); NaClAddSyscall(NACL_sys_mutex_create, &NaClSysMutex_CreateDecoder); /* 70 */ NaClAddSyscall(NACL_sys_mutex_lock, &NaClSysRestricted); NaClAddSyscall(NACL_sys_mutex_unlock, &NaClSysRestricted); NaClAddSyscall(NACL_sys_mutex_trylock, &NaClSysRestricted); NaClAddSyscall(NACL_sys_cond_create, &NaClSysRestricted); NaClAddSyscall(NACL_sys_cond_wait, &NaClSysRestricted); NaClAddSyscall(NACL_sys_cond_signal, &NaClSysRestricted); NaClAddSyscall(NACL_sys_cond_broadcast, &NaClSysRestricted); NaClAddSyscall(NACL_sys_cond_timed_wait_abs, &NaClSysRestricted); NaClAddSyscall(NACL_sys_imc_socketpair, &NaClSysRestricted); NaClAddSyscall(NACL_sys_sem_create, &NaClSysRestricted); NaClAddSyscall(NACL_sys_sem_wait, &NaClSysRestricted); NaClAddSyscall(NACL_sys_sem_post, &NaClSysRestricted); NaClAddSyscall(NACL_sys_sem_get_value, &NaClSysRestricted); NaClAddSyscall(NACL_sys_sched_yield, &NaClSysRestricted); NaClAddSyscall(NACL_sys_sysconf, &NaClSysRestricted); NaClAddSyscall(NACL_sys_dyncode_create, &NaClSysRestricted); NaClAddSyscall(NACL_sys_dyncode_modify, &NaClSysRestricted); NaClAddSyscall(NACL_sys_dyncode_delete, &NaClSysRestricted); NaClAddSyscall(NACL_sys_second_tls_set, &NaClSysRestricted); NaClAddSyscall(NACL_sys_second_tls_get, &NaClSysRestricted); NaClAddSyscall(NACL_sys_test_infoleak, &NaClSysRestricted); }
/* auto generated */ void NaClSyscallTableInit() { int i; for (i = 0; i < NACL_MAX_SYSCALLS; ++i) { nacl_syscall[i].handler = &NotImplementedDecoder; } NaClAddSyscall(One_ring, &OneRingDecoder); /* d'b: 0. added onering call */ NaClAddSyscall(NACL_sys_null, &NaClSysNullDecoder); NaClAddSyscall(NACL_sys_nameservice, &NaClSysNameServiceDecoder); NaClAddSyscall(NACL_sys_dup, &NaClSysDupDecoder); NaClAddSyscall(NACL_sys_dup2, &NaClSysDup2Decoder); NaClAddSyscall(NACL_sys_open, &NaClSysOpenDecoder); NaClAddSyscall(NACL_sys_close, &NaClSysCloseDecoder); NaClAddSyscall(NACL_sys_read, &NaClSysReadDecoder); NaClAddSyscall(NACL_sys_write, &NaClSysWriteDecoder); NaClAddSyscall(NACL_sys_lseek, &NaClSysLseekDecoder); NaClAddSyscall(NACL_sys_ioctl, &NaClSysIoctlDecoder); NaClAddSyscall(NACL_sys_fstat, &NaClSysFstatDecoder); NaClAddSyscall(NACL_sys_stat, &NaClSysStatDecoder); NaClAddSyscall(NACL_sys_getdents, &NaClSysGetdentsDecoder); NaClAddSyscall(NACL_sys_sysbrk, &NaClSysSysbrkDecoder); NaClAddSyscall(NACL_sys_mmap, &NaClSysMmapDecoder); NaClAddSyscall(NACL_sys_munmap, &NaClSysMunmapDecoder); NaClAddSyscall(NACL_sys_exit, &NaClSysExitDecoder); NaClAddSyscall(NACL_sys_getpid, &NaClSysGetpidDecoder); NaClAddSyscall(NACL_sys_thread_exit, &NaClSysThread_ExitDecoder); NaClAddSyscall(NACL_sys_gettimeofday, &NaClSysGetTimeOfDayDecoder); NaClAddSyscall(NACL_sys_clock, &NaClSysClockDecoder); NaClAddSyscall(NACL_sys_nanosleep, &NaClSysNanosleepDecoder); NaClAddSyscall(NACL_sys_imc_makeboundsock, &NaClSysImc_MakeBoundSockDecoder); NaClAddSyscall(NACL_sys_imc_accept, &NaClSysImc_AcceptDecoder); NaClAddSyscall(NACL_sys_imc_connect, &NaClSysImc_ConnectDecoder); NaClAddSyscall(NACL_sys_imc_sendmsg, &NaClSysImc_SendmsgDecoder); NaClAddSyscall(NACL_sys_imc_recvmsg, &NaClSysImc_RecvmsgDecoder); NaClAddSyscall(NACL_sys_imc_mem_obj_create, &NaClSysImc_Mem_Obj_CreateDecoder); NaClAddSyscall(NACL_sys_tls_init, &NaClSysTls_InitDecoder); NaClAddSyscall(NACL_sys_thread_create, &NaClSysThread_CreateDecoder); NaClAddSyscall(NACL_sys_tls_get, &NaClSysTls_GetDecoder); NaClAddSyscall(NACL_sys_thread_nice, &NaClSysThread_NiceDecoder); NaClAddSyscall(NACL_sys_mutex_create, &NaClSysMutex_CreateDecoder); NaClAddSyscall(NACL_sys_mutex_lock, &NaClSysMutex_LockDecoder); NaClAddSyscall(NACL_sys_mutex_unlock, &NaClSysMutex_UnlockDecoder); NaClAddSyscall(NACL_sys_mutex_trylock, &NaClSysMutex_TrylockDecoder); NaClAddSyscall(NACL_sys_cond_create, &NaClSysCond_CreateDecoder); NaClAddSyscall(NACL_sys_cond_wait, &NaClSysCond_WaitDecoder); NaClAddSyscall(NACL_sys_cond_signal, &NaClSysCond_SignalDecoder); NaClAddSyscall(NACL_sys_cond_broadcast, &NaClSysCond_BroadcastDecoder); NaClAddSyscall(NACL_sys_cond_timed_wait_abs, &NaClSysCond_Timed_Wait_AbsDecoder); NaClAddSyscall(NACL_sys_imc_socketpair, &NaClSysImc_SocketPairDecoder); NaClAddSyscall(NACL_sys_sem_create, &NaClSysSem_CreateDecoder); NaClAddSyscall(NACL_sys_sem_wait, &NaClSysSem_WaitDecoder); NaClAddSyscall(NACL_sys_sem_post, &NaClSysSem_PostDecoder); NaClAddSyscall(NACL_sys_sem_get_value, &NaClSysSem_Get_ValueDecoder); NaClAddSyscall(NACL_sys_sched_yield, &NaClSysSched_YieldDecoder); NaClAddSyscall(NACL_sys_sysconf, &NaClSysSysconfDecoder); NaClAddSyscall(NACL_sys_dyncode_create, &NaClSysDyncode_CreateDecoder); NaClAddSyscall(NACL_sys_dyncode_modify, &NaClSysDyncode_ModifyDecoder); NaClAddSyscall(NACL_sys_dyncode_delete, &NaClSysDyncode_DeleteDecoder); NaClAddSyscall(NACL_sys_second_tls_set, &NaClSysSecond_Tls_SetDecoder); NaClAddSyscall(NACL_sys_second_tls_get, &NaClSysSecond_Tls_GetDecoder); NaClAddSyscall(NACL_sys_test_infoleak, &NaClSysTest_InfoLeakDecoder); }