OS/Kernel
Deadlock 데드락
Deadlock 데드락
2018.10.04데드락은 프로세스2개 자원2개만 기억하면 된다. 데드락에는 프로세스2개 자원2개가 필요하니 데드락 케이스를 만들어 낼 때, 프로세스2개 자원2개만 기억하면 만들어 낼 수 있다. 교착 상태 조건 4가지 다음 4가지 조건을 모두 만족하면 데드락이 발생한다. Mutual Exclusion : 상호 배제. 프로세스가 타겟 자원을 요구 시 타 프로세스를 배제하고 배타적으로 요구한다. (자원을 혼자 쓰겠다.) Hold & Wait : 자원 하나 홀드 한 상태에서, 다른 자원이 반환되기를 기다린다. No Preemption : 비선점. 다른 프로세스가 가지고 있는 자원을 선점할 수 없다.[=뺏어올 수 없다] (반대 케이스는 내가 우선순위가 높으면 선점 가능한 경우.) Circular Wait : 대기가 환형으로 발생..
파이프라이닝과 해저드
파이프라이닝과 해저드
2018.06.20Pipeline한 cycle 당 instruction 하나를 모조리 실행하는 단일 사이클 방식은 이미 지나간 데이터 패스 자원이 명령어가 끝나고 다음 명령어가 들어올 때 까지 놀고 있기 때문에, 이런 자원을 계속 돌리기 위해 명령어를 멀티 사이클로 나누고 병렬로 실행하는 방식. 하나의 instruction을 ``c IF - ID - EX - MEM - WB`` 5 stage로 나누고, 한 cycle 당 한 stage 씩 실행하는데 각 stage를 병렬적으로 실행하는 방식이다.하나의 명령어를 실행하는데 5 cycle이 필요한 것 처럼 보이나, 명령어 100개를 파이프라인에 넣고 돌린다고 생각해보면 처음 파이프라인에 명령어를 투입할 때(fill)와 파이프라인에서 마지막 명령어가 빠질 때(drain)를 제외하..
Meltdown 정리
Meltdown 정리
2018.05.26Meltdown핵심은 2가지다.L1 Cache Hit 시 시간과 아닐 때의 시간 비교파이프라이닝 정리하면 다음과 같은 과정으로 익스플로잇.L1 Cache 크기 만큼의 dummy 배열로 L1 Cache 초기화배열 잡고 원하는 데이터(Kernel space data)를 index로 배열에 접근하여 해당 index번째를 L1 Cache에 적재. 즉 index=target data.user mode에서 kernel space 접근하면 보호비트 보고 fault를 일으키지만, 파이프라이닝 때문에 fault가 발생하기 전에 이미 L1 Cache에 타겟 데이터가 적재된 상태. fault는 commit 단계에서 발생하기 때문에 이전 명령어가 이미 execute 단계를 지난 상태. 배열에서 데이터 하나씩 조회해보다가, 다..
CVE-2017-1000112 : Exploitable memory corruption due to UFO to non-UFO path switch
CVE-2017-1000112 : Exploitable memory corruption due to UFO to non-UFO path switch
2017.11.08CVE-2017-1000112https://github.com/xairy/kernel-exploits/blob/master/CVE-2017-1000112/poc.c```cvoid oob_execute(unsigned long payload) {char buffer[4096];memset(&buffer[0], 0x42, 4096);init_skb_buffer(&buffer[SHINFO_OFFSET], payload); int s = socket(PF_INET, SOCK_DGRAM, 0);connect(s, (void*)&addr, sizeof(addr))/* #1 */int size = SHINFO_OFFSET + sizeof(struct skb_shared_info);int rv = send(s, buf..
[kernel] current 구조체 / cred 수정
[kernel] current 구조체 / cred 수정
2017.10.22struct task_struct current/v4.13.8/source/include/linux/sched.h#L519```c struct task_struct {#ifdef CONFIG_THREAD_INFO_IN_TASK /* * For reasons of header soup (see current_thread_info()), this * must be the first element of task_struct. */ struct thread_infothread_info;#endif /* -1 unrunnable, 0 runnable, >0 stopped: */ volatile longstate; ..........................................................
[kernel] hook sys_call_table
[kernel] hook sys_call_table
2017.10.20hook sys_call_table```c#include // included for all kernel modules#include // included for KERN_INFO#include // included for __init and __exit macros#include MODULE_LICENSE("GPL");MODULE_AUTHOR("umbum");MODULE_DESCRIPTION("sys_call_table hooking test"); #define page_offset 0xc0000000#define phys_offset 0x1a000000 // #define __NR_write 4#define __NR_target 4 typedef asmlinkage long (*sys_write_t)..
[kernel] get sys_call_table
[kernel] get sys_call_table
2017.10.16아키텍쳐마다, OS마다 동작이 다르기 때문에 상황에 맞게 생각해야 한다.다음 환경에서 테스트```bashroot@kali32:~/add_syscall# uname -aLinux kali32 4.13.0-kali1-686-pae #1 SMP Debian 4.13.4-1kali1 (2017-10-03) i686 GNU/Linux``` get sys_call_tablesys_call_table의 각 entry는 syscall function의 address이며 ``c syscall()``은 이를 참조하기 때문에, 이를 변경해주면 victim syscall을 호출할 때 마다 변경된 syscall이 호출된다.그러나 다음과 같은 제약이 있다.SYS_CALL_TABLE의 주소를 알아야 한다.SYS_CALL_TABLE..
[kernel] Page Protection
[kernel] Page Protection
2017.10.16Page Protectionx86#1 set_pages_rw , change_page_attrsource/arch/x86/mm/pageattr.c```cint set_pages_rw(struct page *page, int numpages) // use virt_to_page(){unsigned long addr = (unsigned long)page_address(page);return set_memory_rw(addr, numpages);}int set_memory_rw(unsigned long addr, int numpages){return change_page_attr_set(&addr, numpages, __pgprot(_PAGE_RW), 0);}```특정 영역(BIOS, .rodata, .....
[kernel] addr_limit : kernel space arg
[kernel] addr_limit : kernel space arg
2017.10.15addr_limitsystem call은 원래 user mode에서 호출하도록 되어 있기 때문에, system call의 인자로 넘어오는 데이터는 user space의 데이터여야 한다. 인자로 kernel space의 데이터가 넘어오면 제대로 동작하지 않는다. kernel은 `` addr_limit``를 기준으로 인자로 넘어온 데이터가 user space data인지 kernel space data를 구분한다. 따라서 이 경계를 조정해주면 user space data를 넘겨도 정상 동작하도록 만들 수 있다. /source/arch/x86/include/asm/processor.h#L421 ```ctypedef struct { unsigned long seg;} mm_segment_t; struct thr..
[kernel] LKM, Loadable Kernel Module / Kernel Compile
[kernel] LKM, Loadable Kernel Module / Kernel Compile
2017.10.14Loadable Kernel Modulehttps://www.kernel.org/doc/Documentation/kbuild/modules.txt Note ) root가 아니면 `` insmod``를 사용할 수 없기 때문에, LKM을 등록할 수 없다. LKM을 이용하면 커널을 recompile/reboot하지 않아도 커널에 기능을 추가/확장할 수 있다.따라서 syscall을 추가하고, hooking하는 것도 가능하다.드라이버가 대체로 LKM으로 구현되어 있다.확장자는 `` *.ko`` 다.```bashlsmod // listinsmod // insertrmmod // removemodinfo // infomodprobe // insmod와 달리 의존 관계에 있는 모듈까지 insert해준다.``` LKM ..
[kernel] virt_to_phys
[kernel] virt_to_phys
2017.10.13virt_to_phys직접 호출하고 싶다면 kernel mode에서 실행해야 하기 때문에 LKM 등을 사용해야 하며,어느 아키텍쳐든 최종 인터페이스로 다음 함수를 제공하기 때문에 이를 사용하는 편이 좋다.```cstatic inline phys_addr_t virt_to_phys(volatile void *address)``` x86 ( not x86_64 )http://elixir.free-electrons.com/linux/v4.13/source/arch/x86/mm/physaddr.c#L70```cunsigned long __phys_addr(unsigned long x){ unsigned long phys_addr = x - PAGE_OFFSET; .... return phys_addr;}``` ..
[kernel] exploit
[kernel] exploit
2017.10.06이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.