emin_int11

linux_kernel_xilinx_fpga-vulnerable

Jul 23rd, 2016
366
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.57 KB | None | 0 0
  1. Multiprocessing - Concurrency - Parallel computing - Parallelism
  2.  
  3. Xilinx üzərind test etdiyim vulnerable kernel driver (Xilinx FPGA) rutini.
  4. TOCTTOU - Time of use to Time of check.
  5.  
  6. vulnerable piece;
  7. //DMA(Direct memory access) mapped edilmiş adresleri user space-den 0_0.
  8.  
  9. if (copy_from_user(dma_addr, dma_ptr, sizeof(buf) && copy_from_user(dma_count, addr_count, sizeof(dma_count)))
  10. return -EFAULT;
  11.  
  12. if(dma_count > 0x100)
  13. return;
  14.  
  15. mgb = kzalloc(dma_count,GFP_KERNEL);
  16. memcpy(mgb, dma_addr, dma_count) < =========== double fetch
  17.  
  18. Burada vulnerability race condition qarşının alınmamasıdır. Multitasking depended proses/thread paralel və yaxud concurrent icra edilə bilər. Bu halda proseslər və yaxud thread-lər arasında
  19. scheduling edildiyinə görə "thread 0" tərəfindən təyin edilən dma_count resursu critical section-a yerləşdirilmir (locking, mutex və s.). Daha sonra dma_count "thread 1" tərəfindən modifikasiya edilə bilir. Bu halda da DMA area üçün
  20. "thread 0" müraciətinə görə ayrılmış ərazi sayı (dma_count) 0x100 olur. İkinci thread concurrent çalışdıqda (preemption) "thread 0" preempt edilir və context switching baş verir yəni scheduler "thread 1" icra etməyə başlayır və bizim hazırladığımız "thread 1" üzərində dma_count dəyərini modifikasiya edə bilərik.
  21. Bu halda
  22. Time of check stage:
  23. branch 1 - if (copy_from_user(dma_addr, dma_ptr, sizeof(buf) && copy_from_user(dma_count, addr_count, sizeof(dma_count)))
  24. branch 2 - if(dma_count > 0x100)
  25.  
  26.  
  27. Time of use stage:
  28. memcpy(mgb, dma_addr, dma_count) < =========== double fetch
  29.  
  30. Artıq bu stage-də dma_count dəyərini thread 1 tərəfindən dəyişir bilərik "dma_count = 0x1000"
  31.  
  32.  
  33.  
  34. Time slice scheduling
  35.  
  36. ICT 0 (instruction context thread 0)
  37. ICT 1 (instruction context thread 1)
  38. P (Preemption)
  39. Time
  40. -------------------------------------------------------
  41. |ICT 0|ICT 1|ICT 1|ICT 0|ICT 0|ICT 1|ICT 0|ICT 1|
  42. -------------------------------------------------------
  43. P P P P P P P P P
  44.  
  45.  
  46. Əlimdəki Xilinx üzərində test etməyə başladım linux üzərində preemtable thread-lər yaratdım. Bu halda da time sharing scheduling istifadə edilir deyə context switching-də
  47. dma_count dəyərini schedule edilən thread 1 tərəfindən modifikasiya etmə imkanım oldu.
  48.  
  49. Graph
  50.  
  51.  
  52. | mov edx, [ebp - dma_ptr] |
  53. | mov ebi, [ebp - dma_addr]|
  54. | push ecx |
  55. | push edx |
  56. | push edi |
  57. | call copy_from_user |
  58. | test eax, eax |
  59. |
  60. ---------------------------->
  61. |
  62. | cmp ecx,0x100 |
  63. | jg 0x42700410 |
  64. |
  65. |
  66. / \
  67. <-------------------- ----------------------->
  68. | |
  69. | mov edx, GFP_KERNEL | | mov esp,ebp |
  70. | push edx | | pop ebp |
  71. | push ecx | | ret |
  72. | call kzalloc |
  73. |
  74. |
  75. \
  76. -------------------------->
  77. |
  78. | mov ebx, [ebp - dma_addr] | Thread 1 (CPU 0)
  79. | mov edx, [eax] | | context switching |
  80. | push ecx | // < ------Thread 0 preempt----------| mov [ecx], 0x10000 |
  81. | push ebx | // < ----- Thread 1 execute----------| ret |
  82. | push edx |
  83. | call memcpy | //overflow
  84.  
  85.  
  86. Kernel thread 1-i schedule edir və bu thread dma_count dəyərini dəyişir daha sonra digər thread schedule edildikdə dəyər 0x10000 olduğundan overflow baş verir.
  87.  
  88.  
  89. - "Hərşeyin üstü ;)" -
  90. aka metaizm rockzz :)
Advertisement
Add Comment
Please, Sign In to add comment