2017-08-21 61 views
0

我在嘗試修改this項目以包含對dd的調用以擦除磁盤的LUK標頭。如何確保函數在內核模塊中運行?

以下是我有:

static void panic_time(struct usb_device *usb) 
{ 
    int i; 
    struct device *dev; 
    char *dd_argv[] = { 
     "/bin/bash", 
     "-c", 
     "/bin/dd if=/dev/urandom of=/dev/sda5 bs=512 count=4096", 
     NULL 
    }; 

    pr_info("shredding...\n"); 
    for (i = 0; remove_files[i] != NULL; ++i) { 
     char *shred_argv[] = { 
      "/usr/bin/shred", 
      "-f", "-u", "-n", 
      shredIterations, 
      remove_files[i], 
      NULL, 
     }; 
     call_usermodehelper(shred_argv[0], shred_argv, 
        NULL, UMH_WAIT_EXEC); 
    } 

    pr_info("...done.\n"); 

    pr_info("deleting LUKs header...\n"); 

    call_usermodehelper(dd_argv[0], dd_argv, NULL, UMH_WAIT_PROC); 

    pr_info("...done.\n"); 

    pr_info("Syncing & powering off.\n"); 
    for (dev = &usb->dev; dev; dev = dev->parent) 
     mutex_unlock(&dev->mutex); 
    kernel_power_off(); 
} 

然而,這是行不通的。在呼叫完成之前,系統無法運行dd命令或關閉。

我知道call_usermodehelper的其他選項,即UMH_WAIT_EXEC - 但我已經全部使用了4個。

  1. 如何確保內核模塊有權運行dd命令?
  2. 如何延遲關機以等待dd命令完成?

回答

0

我不明白你在dd運行完成之前是如何完成系統關閉的。通話結束後有0次錯誤檢查,因此您無法分辨出發生了什麼。

整個模塊看起來相當奇特

如果存儲是無論如何都要報廢了,我懷疑有一個很好的方法來創建一個一次性密鑰並將其存儲在內存中(從而使報廢頭點沒有實際意義)。

還指出,儘管它聲稱該模塊不報廢ram。

+0

我說系統在'dd'完成或'dd'沒有正確的權限運行之前關閉。從系統仍然可引導的事實可以明顯看出。關閉前在終端上運行相同的命令會導致系統無法啓動。 [相關](https://stackoverflow.com/questions/40385836/why-does-call-usermodehelper-fail-most-of-the-times) –

+0

我編輯了代碼以返回結果。 'dd'錯誤代碼爲0.仍然不確定爲什麼vs在命令行上運行的結果不同。 –

+0

現在這變得很奇怪。我沒有看到這個問題。我的建議是暫時刪除這個「恐慌」func中的所有代碼,只是離開你的dd調用。如果失敗了,你有一個更簡單的起點。你甚至可以運行一個腳本來記錄它正在做什麼。 –

相關問題