seclang01
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* プログラミング言語がセキュリティに関してやるべきこと#1
-(by [[K]], 2020.02.13)
-(タイトルに#1ってついていますが、#2を作るかどうかは未定...
** (0) はじめに
-私は、プログラミング言語を作りたい。・・・私は、プログラ...
-プログラミング言語が、セキュリティに対してできることって...
-これに対して、まず私は、''&size(20){「この言語を使ってい...
-これは理想であって、もちろんすぐに実現できるわけではない...
-さてこれを実現するためには、大きく分けて2つの設計思想が...
-[A] 危ない結果につながるかもしれない命令を削除する。これ...
-[B] 危ない結果につながるかもしれない命令は残すが、本当に...
-これはたとえば、ポインタという言語上の機能について考えた...
-いっぽうで、[B]のアプローチなら、ヌルポインタアクセスと...
-私は、この[A]のアプローチには基本的に不満である。なぜな...
-それでは結局、やりたいことができなくなってその言語を使う...
-しかし、できることが減らなければいいので、ポインタに変わ...
** (1) 言語で対処可能なセキュリティ問題の一覧
-以下に、言語側で支援が可能なセキュリティ問題を示す。これ...
-それぞれの項目の詳細な説明は、後述する。
-記号の意味
--◎: 実行前に確実に検出できる(いわゆるコンパイル時エラー)
--○: 実行時に確実に検出できる
--△: 現在は対応していないが、将来的には対応予定
--×: 対応していないし、今のところは対応予定もない
--?: 検討中
---: 前提となる機能がない
|番号||ES-BASIC 2020年1月末時点|ES-C 2020年1月末時点|
|01-01|配列やポインタアクセスのレンジチェック|CENTER:○|CE...
|01-02|不適切なポインタの減算|CENTER:-|CENTER:△|
|01-03|ポインタアクセス時のアライメントチェック|CENTER:-...
|01-04|free後の不適切なアクセスをエラーにできる(use-afte...
|01-05|二重freeをエラーにできる(double-free 脆弱性)|CEN...
|01-06|メモリリークを発見できる(もしくはGCがあってリーク...
|01-07|整数からポインタへの変換の禁止(特別な構文でのみ許...
|02-01|数値演算のオーバーフローがあった時にエラーにできる...
|02-02|変数値に制約を持たせて、違反した時にエラーにできる...
|03-01|エラー時に、どこでエラーが起きたのか、(最低でも)...
|03-02|どの行を何回実行したのかを報告できる|CENTER:○|CENT...
|03-03|エラー時にスタックトレースを表示できる|CENTER:△|CE...
|04-01|通常実行モードと高速実行モードがあり、それは実行時...
|04-02|実行を一時的に中断し、変数などを自由に確認したのち...
|04-03|キー入力などのアクションによっても、一時的に中断し...
|04-04|エラー時に、変数値などを自由に確認できる|CENTER:○|...
|04-05|中断した状態をファイルに保存したり、そこから再開し...
|05-01|メモリを確保した時に、前のプログラムの実行結果など...
|06-01|ファジングやテストを支援する機能がある|CENTER:×|CE...
-(*1) 変数宣言時に制約を書くことはできないが、デバッグト...
** (2) 詳細説明
-[01-01] ''配列やポインタアクセスのレンジチェック''
--配列の添え字の指定が間違っていたとか、ポインタでmalloc...
int a[10], b[10];などとしている状況で、int *p = &a[9]; の...
--当然のことながら、「ライブラリ関数にやらせれば、レンジ...
-[01-02] ''不適切なポインタの減算''
--2つのポインタの差を計算すると、それが同一の配列に属して...
-[01-03] ''ポインタアクセス時のアライメントチェック''
--int *p;があって、pはmalloc域の中を指していたとしても、...
そういうケースはエラーにできたほうがよい。
-[01-04] ''free後の不適切なアクセスをエラーにできる''
--当然だが、freeした領域にアクセスすることは許されない。...
--即座に思い付く安易な方法としては free(p); したら、自動...
--だからこのアプローチでは解決とはみなさない。
--ではどうするか。すべての変数、すべての構造体(オブジェ...
--私ならこれを以下のアルゴリズムで解決する。
---まずポインタは従来のメモリアドレスのほかに、管理用ハン...
---実際のメモリアクセス際しては、まず管理用ハンドルを使っ...
---次に、取得したリビジョンとポインタ内のリビジョンが一致...
---どちらも合格できていれば、その段階でメモリアクセスをす...
---メモリがfreeされたとき、管理用ハンドルの先の構造体のリ...
---リビジョン番号さえ更新されれば、その管理用ハンドルを他...
--上記のアルゴリズムであれば、ポインタの減算は、管理用ハ...
-[01-05] ''二重freeをエラーにできる''
--同じ領域に対して、freeを二度やってしまうのはもちろんエ...
-[01-06] ''メモリリークを発見できる''
--freeのし忘れは、やはり重大なバグの原因になりえるので、...
--循環参照があっても、見逃さないような機能を是非サポート...
-[01-07] ''整数からポインタへの変換の禁止''
--この必要性がよくわからないかもしれない。つまりはこうい...
--ある関数があったとして、そこにポインタ引数がなければ、...
--ポインタ引数があったとしても、その影響範囲はそのポイン...
--これは実にあたりまえのことだけど、もし、整数からポイン...
--こんな可能性まで気にしなければいけないとしたら、とても...
-[02-01] ''数値演算のオーバーフローがあった時にエラーにで...
--何か適当な演算をしていて、オーバーフローに気付けないと...
--この計算値は絶対に正になる。なぜなら正の値しか加算して...
--もちろんここに示したそれ以外のセキュリティ機能によって...
--(いやでも、自分の預金残高が、ものすごいプラスからもの...
-[02-02] ''変数値に制約を持たせて、違反した時にエラーにで...
--この変数は7の倍数しかとらないとか、この変数は最大でも99...
--しかし一方で、そういう記述はやや煩雑になりすぎるきらい...
-[03-01] ''エラー時に、どこでエラーが起きたのか、(最低で...
--単にエラーがあったと分かるだけでは、ほとんどデバッグの...
--もちろんエラー種別も報告してもらえるのならそれに越した...
-[03-02] ''どの行を何回実行したのかを報告できる''
--究極的には、どの行をどの順番で実行したかのログがあれば...
--これがあれば、今回の実行でどのくらいの部分が実行テスト...
-[03-03] ''エラー時にスタックトレースを表示できる''
--コールスタックがあれば、関数の奥深くでエラーが起きた際...
-[04-01] ''通常実行モードと高速実行モードがあり、それは実...
--高速実行モードというのは、要するにプログラムを信用して...
--むしろ高速モードがないと、「このチェックをやったら遅く...
--言語利用者は、遅くなったら困るときと、遅くてもいいから...
--また、コードを信用するかどうかは、基本的には実行者の意...
--別のケースとしては、実行環境が貧弱で、高速モードにしな...
--コンパイラなどでは、リリースモードとデバッグモードがあ...
--ユーザが選べることに意義があるので、言語利用者が自分の...
-[04-02] ''実行を一時的に中断し、変数などを自由に確認した...
--これは言語側の機能で実現してもいいし、デバッガなどとの...
--(そのためには十分なデバッグ情報をデバッガ側に渡してお...
-[04-03] ''キー入力などのアクションによっても、一時的に中...
--これも言語側の機能で実現してもいいし、デバッガなどとの...
-[04-04] ''エラー時に、変数値などを自由に確認できる''
--これも言語側の機能で実現してもいいし、デバッガなどとの...
-[04-05] ''中断した状態をファイルに保存したり、そこから再...
--この機能があれば、怪しくなる直前で保存して、そこから何...
--これも言語側の機能で実現してもいいし、OSなどとの連携で...
-[05-01] ''メモリを確保した時に、前のプログラムの実行結果...
--ただし、後続のプログラムが、「ファイル保存しない」や「...
--safe-runみたいな命令があって、それで実行すると、メモリ...
--何でもかんでもクリアするだけでよければ簡単なのだが、そ...
-[06-01] ''ファジングやテストを支援する機能がある''
--この機能は結局何をしたいのかというと、「この入力値の組...
--ここではES-Cがどういう機能を予定しているのか紹介したい...
--ES-Cでは、fuzz(0,100)みたいなコマンドがある。これはRUN...
--つまりRUNが101回、自動で行われると思えばよい。
--ES-Cはファジングモードで実行しているときは、入力命令や...
--デフォルトのデバッグトラップ関数はランダム関数なのだが...
--重たい関数を含む場合、ファジングモードではこの関数をス...
--ファジング実行中は、画面出力やファイル出力を完全に抑制...
--セキュリティエラーを起こした場合、ファジングの内部番号...
--一つの試行に延々と時間をかけてもしょうがないので、ある...
終了行:
* プログラミング言語がセキュリティに関してやるべきこと#1
-(by [[K]], 2020.02.13)
-(タイトルに#1ってついていますが、#2を作るかどうかは未定...
** (0) はじめに
-私は、プログラミング言語を作りたい。・・・私は、プログラ...
-プログラミング言語が、セキュリティに対してできることって...
-これに対して、まず私は、''&size(20){「この言語を使ってい...
-これは理想であって、もちろんすぐに実現できるわけではない...
-さてこれを実現するためには、大きく分けて2つの設計思想が...
-[A] 危ない結果につながるかもしれない命令を削除する。これ...
-[B] 危ない結果につながるかもしれない命令は残すが、本当に...
-これはたとえば、ポインタという言語上の機能について考えた...
-いっぽうで、[B]のアプローチなら、ヌルポインタアクセスと...
-私は、この[A]のアプローチには基本的に不満である。なぜな...
-それでは結局、やりたいことができなくなってその言語を使う...
-しかし、できることが減らなければいいので、ポインタに変わ...
** (1) 言語で対処可能なセキュリティ問題の一覧
-以下に、言語側で支援が可能なセキュリティ問題を示す。これ...
-それぞれの項目の詳細な説明は、後述する。
-記号の意味
--◎: 実行前に確実に検出できる(いわゆるコンパイル時エラー)
--○: 実行時に確実に検出できる
--△: 現在は対応していないが、将来的には対応予定
--×: 対応していないし、今のところは対応予定もない
--?: 検討中
---: 前提となる機能がない
|番号||ES-BASIC 2020年1月末時点|ES-C 2020年1月末時点|
|01-01|配列やポインタアクセスのレンジチェック|CENTER:○|CE...
|01-02|不適切なポインタの減算|CENTER:-|CENTER:△|
|01-03|ポインタアクセス時のアライメントチェック|CENTER:-...
|01-04|free後の不適切なアクセスをエラーにできる(use-afte...
|01-05|二重freeをエラーにできる(double-free 脆弱性)|CEN...
|01-06|メモリリークを発見できる(もしくはGCがあってリーク...
|01-07|整数からポインタへの変換の禁止(特別な構文でのみ許...
|02-01|数値演算のオーバーフローがあった時にエラーにできる...
|02-02|変数値に制約を持たせて、違反した時にエラーにできる...
|03-01|エラー時に、どこでエラーが起きたのか、(最低でも)...
|03-02|どの行を何回実行したのかを報告できる|CENTER:○|CENT...
|03-03|エラー時にスタックトレースを表示できる|CENTER:△|CE...
|04-01|通常実行モードと高速実行モードがあり、それは実行時...
|04-02|実行を一時的に中断し、変数などを自由に確認したのち...
|04-03|キー入力などのアクションによっても、一時的に中断し...
|04-04|エラー時に、変数値などを自由に確認できる|CENTER:○|...
|04-05|中断した状態をファイルに保存したり、そこから再開し...
|05-01|メモリを確保した時に、前のプログラムの実行結果など...
|06-01|ファジングやテストを支援する機能がある|CENTER:×|CE...
-(*1) 変数宣言時に制約を書くことはできないが、デバッグト...
** (2) 詳細説明
-[01-01] ''配列やポインタアクセスのレンジチェック''
--配列の添え字の指定が間違っていたとか、ポインタでmalloc...
int a[10], b[10];などとしている状況で、int *p = &a[9]; の...
--当然のことながら、「ライブラリ関数にやらせれば、レンジ...
-[01-02] ''不適切なポインタの減算''
--2つのポインタの差を計算すると、それが同一の配列に属して...
-[01-03] ''ポインタアクセス時のアライメントチェック''
--int *p;があって、pはmalloc域の中を指していたとしても、...
そういうケースはエラーにできたほうがよい。
-[01-04] ''free後の不適切なアクセスをエラーにできる''
--当然だが、freeした領域にアクセスすることは許されない。...
--即座に思い付く安易な方法としては free(p); したら、自動...
--だからこのアプローチでは解決とはみなさない。
--ではどうするか。すべての変数、すべての構造体(オブジェ...
--私ならこれを以下のアルゴリズムで解決する。
---まずポインタは従来のメモリアドレスのほかに、管理用ハン...
---実際のメモリアクセス際しては、まず管理用ハンドルを使っ...
---次に、取得したリビジョンとポインタ内のリビジョンが一致...
---どちらも合格できていれば、その段階でメモリアクセスをす...
---メモリがfreeされたとき、管理用ハンドルの先の構造体のリ...
---リビジョン番号さえ更新されれば、その管理用ハンドルを他...
--上記のアルゴリズムであれば、ポインタの減算は、管理用ハ...
-[01-05] ''二重freeをエラーにできる''
--同じ領域に対して、freeを二度やってしまうのはもちろんエ...
-[01-06] ''メモリリークを発見できる''
--freeのし忘れは、やはり重大なバグの原因になりえるので、...
--循環参照があっても、見逃さないような機能を是非サポート...
-[01-07] ''整数からポインタへの変換の禁止''
--この必要性がよくわからないかもしれない。つまりはこうい...
--ある関数があったとして、そこにポインタ引数がなければ、...
--ポインタ引数があったとしても、その影響範囲はそのポイン...
--これは実にあたりまえのことだけど、もし、整数からポイン...
--こんな可能性まで気にしなければいけないとしたら、とても...
-[02-01] ''数値演算のオーバーフローがあった時にエラーにで...
--何か適当な演算をしていて、オーバーフローに気付けないと...
--この計算値は絶対に正になる。なぜなら正の値しか加算して...
--もちろんここに示したそれ以外のセキュリティ機能によって...
--(いやでも、自分の預金残高が、ものすごいプラスからもの...
-[02-02] ''変数値に制約を持たせて、違反した時にエラーにで...
--この変数は7の倍数しかとらないとか、この変数は最大でも99...
--しかし一方で、そういう記述はやや煩雑になりすぎるきらい...
-[03-01] ''エラー時に、どこでエラーが起きたのか、(最低で...
--単にエラーがあったと分かるだけでは、ほとんどデバッグの...
--もちろんエラー種別も報告してもらえるのならそれに越した...
-[03-02] ''どの行を何回実行したのかを報告できる''
--究極的には、どの行をどの順番で実行したかのログがあれば...
--これがあれば、今回の実行でどのくらいの部分が実行テスト...
-[03-03] ''エラー時にスタックトレースを表示できる''
--コールスタックがあれば、関数の奥深くでエラーが起きた際...
-[04-01] ''通常実行モードと高速実行モードがあり、それは実...
--高速実行モードというのは、要するにプログラムを信用して...
--むしろ高速モードがないと、「このチェックをやったら遅く...
--言語利用者は、遅くなったら困るときと、遅くてもいいから...
--また、コードを信用するかどうかは、基本的には実行者の意...
--別のケースとしては、実行環境が貧弱で、高速モードにしな...
--コンパイラなどでは、リリースモードとデバッグモードがあ...
--ユーザが選べることに意義があるので、言語利用者が自分の...
-[04-02] ''実行を一時的に中断し、変数などを自由に確認した...
--これは言語側の機能で実現してもいいし、デバッガなどとの...
--(そのためには十分なデバッグ情報をデバッガ側に渡してお...
-[04-03] ''キー入力などのアクションによっても、一時的に中...
--これも言語側の機能で実現してもいいし、デバッガなどとの...
-[04-04] ''エラー時に、変数値などを自由に確認できる''
--これも言語側の機能で実現してもいいし、デバッガなどとの...
-[04-05] ''中断した状態をファイルに保存したり、そこから再...
--この機能があれば、怪しくなる直前で保存して、そこから何...
--これも言語側の機能で実現してもいいし、OSなどとの連携で...
-[05-01] ''メモリを確保した時に、前のプログラムの実行結果...
--ただし、後続のプログラムが、「ファイル保存しない」や「...
--safe-runみたいな命令があって、それで実行すると、メモリ...
--何でもかんでもクリアするだけでよければ簡単なのだが、そ...
-[06-01] ''ファジングやテストを支援する機能がある''
--この機能は結局何をしたいのかというと、「この入力値の組...
--ここではES-Cがどういう機能を予定しているのか紹介したい...
--ES-Cでは、fuzz(0,100)みたいなコマンドがある。これはRUN...
--つまりRUNが101回、自動で行われると思えばよい。
--ES-Cはファジングモードで実行しているときは、入力命令や...
--デフォルトのデバッグトラップ関数はランダム関数なのだが...
--重たい関数を含む場合、ファジングモードではこの関数をス...
--ファジング実行中は、画面出力やファイル出力を完全に抑制...
--セキュリティエラーを起こした場合、ファジングの内部番号...
--一つの試行に延々と時間をかけてもしょうがないので、ある...
ページ名: