secure scheme script suite

26
1 Secure Scheme Script Suite (Squad) ~~TOD~~ Shibuya lisp technical talk #7

Upload: shibuyalisp

Post on 07-Apr-2017

1.402 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Secure Scheme Script Suite

1

Secure Scheme Script Suite (Squad)

~~TOD~~

Shibuya lisp technical talk #7

Page 2: Secure Scheme Script Suite

2

自己紹介

• 1974年i4004を使った装置製作でプログラミングを学ぶ• 1981年K&RのC言語を学ぶ• 1982年前後でLisp, Prologに興味を持つが挫折する• :• :• :• 2010年セキュアなプログラム開発環境が欲しくて調査、

Lispに興味を持ちcampuslispにセキュリティを組み込 んでみる

• 2011年Rubyにセキュリティを組み込もうとして断念し minischemeにセキュリティを移植する検討を始める

• そして今日、まだSchemeの全てを知らない素人!

Page 3: Secure Scheme Script Suite

3

Agenda技術編

SecureなScript言語の必要性SchemeがSecureであるためにObjectへのSecurity属性とTypeの追加

定義や設定内容を保持するためにパスワード認証を安全に行うために認証後の入出力はSecureにリモート入出力としてのソケット通信セキュリティ組み込みによる制限New Syntax & Procedure既存SyntaxとProcedureの制限

デモデモの構成アクセスコントロール機能と権限確認方法の紹介

ビジネス編Script言語のすむ世界Script言語を使ったアプリは何故商売に向かない?Script言語だから!!!

セキュリティウォーズS-quad + Backup-base ⇒ DROID

Page 4: Secure Scheme Script Suite

4

SecureなScript言語の必要性

• コンパイル型言語はセキュリティ機能を持つ• ソース無しでの解析・改ざんは困難

• 脆弱性テストが確立している

• セキュリティ機能組み込みは実装者に依存し強度が不定?

• Script言語はセキュリティが無い• 起動時に読み込ませるためソースコードが丸見え

• ソースコード解析・改ざんは容易

• 使用中、勝手に関数利用や変数内容変更ができる

• 利用者に楽しいプログラミングの世界を開放している

• 解決策はセキュリティ!• さて…

Page 5: Secure Scheme Script Suite

5

SchemeがSecureであるために

• 変数の値を勝手に知られたくない• 読み出し時には権限を確認する

(Eval)

• 変数を勝手に変更されたくない• 書き込み時には権限を確認する

(Mod)

• 関数コードを不用意に見られたくない• 関数読み出し時には権限を確認する

(Eval)

• 関数コードを勝手に変更されたくない• 関数変更時には権限を確認する

(Mod)

• 関数を勝手に実行されたくない• 関数実行時には権限を確認する

(eXec)

• 権限確認用パスワードを他の人見られたくない• 権限を持つ人が設定できその後は自らも簡単に見れないように

• パスワード認証後は通信も秘密にしたい• 暗号化通信を行う(Encrypt)

Page 6: Secure Scheme Script Suite

6

ObjectへのSecurity属性と表記 Type、表現形式の追加

• Object Cell に評価・変更・実行用

ロックフラグを用意 する

• Object Cell に権限確認パスワードとのリンクを張る• パスワード用途のObjectとしてBlock Type (128

bit) を追加する• Block Type データを保持するBlock Segment を

追加する• Block Type の表記にはHexa Decimal と

Base64を用いる• ファイルバックアップ、相互通信にはBase64エンコード

を利用する

Page 7: Secure Scheme Script Suite

7

変数タイプと属性の追加(例)• /* cell structure */• struct cell {• unsigned short _flag;• struct cell *_osec;• union {• struct {• char *_svalue;• short _keynum;• } _string;• struct {• short _nb;• unsigned short _bver;• bpointer _pblock;• } _blocks;• struct {• long _ivalue;• } _number;• struct {• struct cell *_car;• struct cell *_cdr;• } _cons;• } _object;• };

• #define T_STRING 1 /* 0000000000000001 */• #define T_NUMBER 2 /* 0000000000000010 */• #define T_SYMBOL 4 /* 0000000000000100 */• #define T_SYNTAX 8 /* 0000000000001000 */• #define T_PROC 16 /* 0000000000010000 */• #define T_PAIR 32 /* 0000000000100000 */• #define T_CLOSURE 64 /* 0000000001000000 */• #define T_CONTINUATION 128 /* 0000000010000000 */• #ifdef USE_MACRO• #define T_MACRO 256 /* 0000000100000000 */• #endif• #define T_PROMISE 512 /* 0000001000000000 */• #define F_EVALLOCK 1024 /* 0000010000000000 */• #define F_MODLOCK 2048 /* 0000100000000000 */• #define F_EXECLOCK 4096 /* 0001000000000000 */• #define T_BLOCK 8192 /* 0010000000000000 */• #define T_ATOM 16384 /* 0100000000000000 */• #define CLRATOM 49151 /* 1011111111111111 */• #define MARK 32768 /* 1000000000000000 */• #define UNMARK 32767 /* 0111111111111111 */

権限鍵と

のリンク

128Bit

Block

Security FlagBlock

Type

Page 8: Secure Scheme Script Suite

8

定義や設定内容を保持するために

• Backup 機能の組み込み• その時点の状態をScheme式に逆変換し特定のパスワードで保護しファ

イルに保存する• Resume機能の組み込み

• Backup ファイルは起動時に自動読み込みしScheme を初期化する

• セキュアな関数定義• 関数定義では使用する関数・変数が持つセキュリティ属性を確認しそれ

らが前もって認証済みであるか確認する

• 操作権限委譲• 定義済みの関数はその関数が利用する関数・変数のセキュリティ属性

かかわらず評価、実行できる

• 削除機能の追加• 定義済み関数・変数を未定義化する構文undef を追加

• アクセスコントロール• 評価・実行時はそのSymbolのセキュリティ制限にしたがう

• Shutdown時の考慮• 終了時は内部状態を暗号化しBackupする

Page 9: Secure Scheme Script Suite

9

パスワード認証を安全に行うために

• 乱数を用いたパスワード交換• 乱数をパスワードで暗号化し相互に交換するアルゴリズムを用

いて平文のパスワード交換を無くす

• モジュール分割した認証• パスワード保持プログラムを他のモジュールに用意しパスワード

チャレンジに対しレスポンスを確認し認証する

• 認証リスト• 複数同時認証を可能とし認証済みのObject は認証リストに登

録しObject利用時にスキャンし確認する

• 認証切り替え• 認証を切り替えるには今までの認証記録の消去がされ、新たに

認証リストが作成される

Page 10: Secure Scheme Script Suite

10

認証後の入出力はSecureに

• ローカル入出力• キーボードを用いた入力は利用環境をセキュアーにする前提で平

文による入出力

• リモート入出力• リモート入出力のポートの組み込みで外部からの指示を受け付け

• リモートポートからのキーボード入力に対しては通信を暗号化する

• パスワード認証時に交換する乱数をセッション鍵として利用する

• 通信パケットにカウンターを組み込みリトライ攻撃を防止する

• 通信入力データを復号し結果を同じセッション鍵で暗号化し返信

する

Page 11: Secure Scheme Script Suite

11

リモート入出力としてのソケット通信

機能を組み込む

• モジュール間通信• ローカル入出力からソケットを介し他のモジュールと通信する機

能を持つ

• リモート制御• リモートプログラムはスクリプトをソケットを介して送信し結果を受

信する

• 認証パスワードを保持し乱数を用いたチャレンジパケットを生成

送信しレスポンスを解析する(外部認証)

• 相手からのチャレンジパケットを受信し乱数を用いたレスポンス

パケットを生成し送信する(内部認証)

• 相互に認証が成功した以降の全ての通信は暗号化するモードと

なる

Page 12: Secure Scheme Script Suite

12

セキュリティ組み込みによる制限

• 暗号通信機能の追加• 認証後はデータをセッション鍵で暗号化しその結果を印刷可能な

コードBase64に変換し送信する• 受信したコードをBase64で逆変換し、その後セッション鍵で復

号してデータを得る

• 組み込み関数動作制限• セキュリティフラグが設定されているObjectの利用には認証が

必要• 関数定義で組み込む関数・変数は前もって定義され認証済みで

あること• 定義済み関数の利用時はその関数に組み込まれた関数・変数

の認証を再度必要せず、定義関数に設定されたセキュリティ属

性のみに従う

Page 13: Secure Scheme Script Suite

13

New Syntax & Procedure 1

• backup• define した関数と変数も含めた 新の内部表現を外部表現に

変換してバックアップ

• undef• Define した関数・変数を削除する

• setsym• Symbol にセキュリティフラグ(EMX)と認証鍵をセットする

• reqsym• セットされたObjectのセキュリティフラグ(EMX)確認

• auth1• 相互認証Pass 1

• auth2• 相互認証Pass 2

Page 14: Secure Scheme Script Suite

14

New Syntax & Procedure 2

• ex-auth1• 外部モジュールとの相互認証

Pass 1 (auth1の生成送信)

• ex-auth2• 外部モジュールとの相互認証

Pass 2 (auth2の生成送信)

• start-minion• モジュールへの外部制御を許可する

• conn-minion• 外部モジュールに接続する

• req-minion• 外部モジュールとの通信

• 状態確認関数• auth-mode, get-minion

Page 15: Secure Scheme Script Suite

15

既存SyntaxとProcedureへ の制限• define

• 引数は定義済みであり且つセキュリティフラグを確認し認証済み

であることが続行条件

• eval• 引数にTLO*が有ればそのセキュリティフラグを確認し認証済み

であることが続行条件(Closureは除く)

• apply• TLO*のセキュリティフラグを確認し認証済みであることが評価

続行の条件

• set!, set-car!, set-cdr!, • TLO*のセキュリティフラグを確認し認証済みであることが変更

実行の条件

*TOL: Top Level Object

Page 16: Secure Scheme Script Suite

16

相互認証方式の例

_ra _rb

ENC

DEC

ENC

DEC

ENC

DEC

ENC

DEC

_ra1 _rb1_rb1 _ra1

M1 M3

M4 M2

_key _key

0101……….80

ENC a’

ENC b’’

0101……….80

ENCa

ENCb

認証アルゴリズム 1 認証アルゴリズム 2

_ra == _ra1 _rb == _rb1

Page 17: Secure Scheme Script Suite

17

デモの構成

ninja

xxx1.escm

ninja

xxx2.escm

ninja

xxx4.escm

Display

KB

ninja

xxx3.escm

Ninja1

Ninja4

Ninja3

Ninja2

Page 18: Secure Scheme Script Suite

18

Demonstration

Bug still alive

Page 19: Secure Scheme Script Suite

19

Script言語のすむ世界(私見)

• Script言語は脇役であり主役になれない• チョイ作りにはとても便利だがしっかり作るときはCompilerで

高速化• ユーザーに機能の部分開放目的で他のソフトにバインドされる• Scriptその物の販売では商売にならない

• 高級言語の上に位置する上級言語• Compilerで組み込まれた上級言語• 要求仕様作成言語?• テスト仕様作成言語?

• 住んでいる世界は• SIの道具として机の中、思考訓練用途で頭の中、実行アプリの

ポケットの中、暗いQAテスト機の中、解説書の本の中

• 将来も安泰か?• CompilerがVMと結託して攻めて来る• 自分を守れれば生きながらえると信じよう!

Page 20: Secure Scheme Script Suite

20

Script言語を使ったアプリは何 故商売に向かない?• ソフトの知的財産権が守れない

• 複製検出が出来ない

• 勝手に機能追加できてしまう

• サポートが出来ない• トレーサビリティ機能を組み込む事が難しい

• ソースコードの勝手な変更によるトラブルのサポートが出来ない

• 単一個別要求に向くので• 趣味の世界

• プロトタイプモデルの開発

• 検査機のテストスクリプト

• ビジネスにするとしたら• やっぱり解説書でアカデミックに!

Page 21: Secure Scheme Script Suite

21

Script言語だから!!!

• ライブラリー化されやすく教育に便利• Script言語で作成した実行プログラムは可読性が高く、再利用が容易

で、ライブラリー化され易く、先人の知恵を学べる

• 柔軟な機能修正• REPL構造により、組み込んだ定義を更に評価対象として修正定義出

来る事が大きな特徴

• 柔軟性の裏返し• Script言語の実行プログラムが編集可能なため脆弱性が生まれてし

まうが、実行プログラムへのアクセスコントロール機能が組み込まれると

その弱点は消えていく

• 脆弱性対策• 一度組み込んだScriptが実行モジュールとして一体と成りScriptの再

読み込みを必要としない構成であれば、Compiler言語による実行モ

ジュールと秘匿性に対する相違が無くなりScript言語の良さが際立っ

てくる• 便利で安心に

• アクセスコントロール機能の活性化をフィールドで行うなどの柔軟性が

組み込こめるのはScript言語の特権である

Page 22: Secure Scheme Script Suite

22

レイヤー構造とロールの違い

Hardware

Device Driver

Operating System

Virtual Machine

Applet

Squad

Script

Application Programmer Applimenter

Application+

Implementer=

Applimenter

CompileEdit

Test

UploadSquad

Page 23: Secure Scheme Script Suite

23

Squad Applications

Sq-Scheme Sq-RubySq-Java/Scheme Sq-Python

Sq-Scheme

Sq-Scheme

Sq-Scheme

IC Card

Page 24: Secure Scheme Script Suite

24

S-quad + Backup-base ⇒ DROID

• シナリオを分解し、スクリプトとしてアクターに表 現させ、劇を完成させる静的な世界から飛び出し、

• アクターはスクリプトを読み込み租借して進化す る知能を持つものとし、

• ダイナミックなネットワーク構築と階層化で集団と して進化を可能とさせる

• Droid Epic Compile を目指す

Dynamically React-able Object by the Internet Device

Page 25: Secure Scheme Script Suite

25

Droid Scheme Net

Page 26: Secure Scheme Script Suite

26

ご清聴有難うございました

門外漢の視点でした