DynPTA: Combining Static and Dynamic Analysis for Practical Selective Data Protection [SP’21]

github: https://github.com/taptipalit/dynpta

調査の目的

概要

背景: Pointer Analysis

手法

以下のコードにおいて,priv_keyを保護する流れを追う.

char* ptr;

char* priv_key = malloc_wrapper(8);
// calculate priv_key
ptr = priv_key;
...

char* pub_key = malloc_wrapper(8);
// calculate pub_key
ptr = pub_key;
...

静的解析

  1. プログラマがsensitiveデータにannotationをつける
    • priv_keyにannotate
  2. malloc-wrapper関数の候補を見つけ,Intra-proceduralポインタ解析により特定する
    • malloc_wrapper()
  3. Steengardポインタ解析により,sensitiveデータを指しうるポインタを求める
    • malloc-wrapper関数においては,異なる呼び出しでは異なるobjectを確保すると解析する(context-sensitive heap modeling)
    • 例では,{ptr, priv_key, pub_key}がsensitiveデータo1を指す ```c char* ptr;

char* priv_key = malloc_wrapper(8); // o1 mark_sensitive(priv_key); // calculate priv_key ptr = priv_key; …

char* pub_key = malloc_wrapper(8); // o2 // calculate pub_key ptr = pub_key; …

4. Value-Flow解析により,sensitiveデータに関するValue-Flowをsoundに求める
5. Potential sensitive instruction(sensitiveデータにアクセスしうる命令)にメタデータを付け,実行時の目印とする
    - 例では,全命令が該当

まとめ: 
- sensitiveデータを特定
- Potential sensitive instructionsを特定

### 動的解析部分 Dynamic Flow Tracking(DFT)

6. Shadow memoryを用意し,annotationの付いたsensitiveデータに対してShadow memoryの該当箇所に印(taint)をつける

![](img/taint_priv_key.drawio.svg)

7. Potential sensitive instructionに対して,以下の処理を行う:
    - Load: Shadow memoryにtaintが付いている場合,読み込むデータにtaintを付け,**復号**
      - データの復号
    - Store: taintが付いているデータを書き込む場合,Shadow memoryにtaintを付け,**暗号化**して書き込む
      - データの暗号化
    - Others: (top-variableに対して) taintの伝播処理を行う
      - テイントの伝搬

例では,
- `o1`はテイントされ,暗号化される
- `o2`はテイントされず,保護されない
```c
char* ptr;

char* priv_key = malloc_wrapper(8); // o1
mark_sensitive(priv_key);
// calculate priv_key
ptr = priv_key;
...

char* pub_key = malloc_wrapper(8);  // o2
// calculate pub_key
ptr = pub_key;
...

まとめ:

実験結果

Application Protected Data KLOC Bitcode Size DynPTA Compilation Runtime Overhead
Nginx + OpenSSL Private key 389 8M 50.6 min + 17.92%
Httpd Password 179 3.7M 11.0 min + 1.86%
Lighttpd + ModAuth Password 83 1.9M 2.8 min + 1.87%
MbedTLS server Private Key 54 726K 1.3 min + 4.08%
OpenVPN Private Key 329 3.5M 59.1 min + 9.81%
Memcached + Auth Password 71 1.1M 1.0 min + 0.32%
ssh-agent Private Key 52 640K 1.3 min + 3.15%
Minisign Private Key 45 1.2M 37 sec + 22.02%

自分の研究との関連