111年資訊技師高等系統分析與資訊安全第四題

四、資訊系統的安全性非常重要,要落實安全的軟體生命週期,須從安全需求規格、安全設計階段著手整體資訊系統安全,並以安全程式設計原則與最佳實務撰寫程式。程式安全分類可協助開發者辨識安全問題,了解程式碼錯誤可能引發的安全問題,提升軟體安全。程式安全分類可以有:

    「輸入驗證及表示 (Input Validation and Representation)」、「應用程式介面誤用 (API Abuse)」、「安全特性 (Security Features)」、「時間與狀態 (Time and State)」、「錯誤處理 (Error Handling)」、「程式碼品質 (Code Quality)」、「封裝(Encapsulation)」等。

    ()「時間與狀態」的安全問題,是在多核心 CPU 或分散式系統中,兩個事件發生在幾乎同一時間;程式設計多執行緒 (Threads)、多程序(Process) 等造成執行期之時間與狀態及訊息間產生非預期的交互作用。請說明這些狀況可能導致的安全問題有那些。(5分)

    ()「輸入驗證及表示」是程式處理使用者或外部輸入的安全性問題,請說明此問題可能導致的攻擊有那些。(10分)

    ()「錯誤處理」不適當是十分常見的程式安全缺陷問題,請舉出兩種「錯誤處理」不適當的類別或狀況。(10分)

答:

()

1.分散式運算與時間和狀態相關。也就是說,為了使多個元件進行通訊,必須共用狀態,並且這一切都需要時間。

2.大多數的程式設計師將他們的工作擬人化。他們想採用一種控制執行緒來執行 整個程式,就像他們必須自己完成這項工作一樣。但是,現代的電腦可以非常快速地切換工作,並且在多核心多 CPU 或分散式系統中,兩個事件可能恰好同時發生。

3.瑕疵急於填補程式設計師在程式執行模型與實際情況之間的差距。這些瑕疵與執行緒、處理序、時間和資訊之間的意外互動有關。這些互動透過共用狀態發生 (如信號、變數、檔案系統),以及基本上任何可以儲存資訊的項目。

4.建立和使用不安全的暫存檔案會使得應用程式和系統資料產生安全性弱點,容 易受到攻擊。

5.範例:

  如果多個執行緒嘗試鎖定資源,呼叫 sleep( ) 的同時還持續鎖定會讓所有其他執行緒等待資源釋放,這會導致效能降低與鎖死。下列程式碼會呼叫 sleep( ) 並同時持續鎖定。

ReentrantLock rl = new ReentrantLock( );

...

rl.lock( );

Thread.sleep(500);

...

rl.unlock( );

()

1.輸入驗證和表示法問題是由中繼字元、替代編碼和數值表示法引起的。

2.信任輸入會導致安全問題,包括 Buffer OverflowsCross-Site Scripting 攻擊、SQL Injection,以及其他許多問題。

3.範例:

  錯誤建構的 Format String 會導致程式寫入分配記憶體邊界以外的位置。以下程式碼溢出 buf,因為視 f 的大小而定,Format String 規範 "%d %.1f ... " 會超出分配記憶體容量。

void formatString(int x, float f) {

    char buf[40];

    sprintf(buf, "%d %.1f ... ", x, f);

}

()

1.有兩種方法可以引入與錯誤相關的安全漏洞,最常見的一種方法是不當處理錯 (或根本沒有處理)。第二種是產生錯誤,這些錯誤不是給的資訊太多 (給可能的攻擊者),就是問題難以處理。

2.範例一:

  忽略異常可能會導致程式忽略無法預期的狀態與情況。以下所引用的程式碼忽略了由 open( ) 拋出的罕見異常 (RareException)

// PHP

try:

    f = open('myfile.txt')

    s = f.readline( )

    i = int(s.strip( ))

except:

   # This will never happen

   pass

  如果拋出了 RareException,程式會繼續執行,就像什麼都沒有發生過一樣。程式不會記錄有關此特殊情況,這將使得事後嘗試尋找程式此異常的運作方式變得很困難。

3.範例二:

  一個方法拋出一個過於籠統的異常違反該系統。下列方法拋出三種類型的異常。

// JSP

public void doExchange( ) throws IOException, InvocationTargetException, SQLException {

    ...

}

  這樣看起來比較整齊。

public void doExchange( ) throws Exception {

    ...

}

  這樣做會防礙呼叫者理解和處理所發生異常。此外,如果 doExchange( ) 方法因為變更了程式碼,而引入一個需要不同處理方式的異常,則不能用簡單的方式來處理該要求。

參考資料:

1.https://vulncat.fortify.com/zh-tw

2.https://blog-peven-me.translate.goog/post/2018/11/25/chdir-and-chroot/?_x_tr_sl=zh-CN&_x_tr_tl=zh-TW&_x_tr_hl=zh-TW&_x_tr_pto=sc

3.https://ithelp.ithome.com.tw/articles/10204463

4.https://zh.wikipedia.org/zh-tw/%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F#C++

arrow
arrow

    jacksaleok 發表在 痞客邦 留言(0) 人氣()