Paper.thy
author Christian Urban <christian dot urban at kcl dot ac dot uk>
Fri, 06 Sep 2013 12:55:12 +0100
changeset 13 dd1499f296ea
parent 11 31d3d2b3f6b0
child 14 d43f46423298
permissions -rw-r--r--
updated to new isabelle
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
     1
(*<*)
dcde836219bc add thy files
chunhan
parents:
diff changeset
     2
theory Paper
dcde836219bc add thy files
chunhan
parents:
diff changeset
     3
imports rc_theory final_theorems rc_theory os_rc 
dcde836219bc add thy files
chunhan
parents:
diff changeset
     4
begin
dcde836219bc add thy files
chunhan
parents:
diff changeset
     5
dcde836219bc add thy files
chunhan
parents:
diff changeset
     6
(* THEOREMS *)
dcde836219bc add thy files
chunhan
parents:
diff changeset
     7
dcde836219bc add thy files
chunhan
parents:
diff changeset
     8
dcde836219bc add thy files
chunhan
parents:
diff changeset
     9
notation (Rule output)
dcde836219bc add thy files
chunhan
parents:
diff changeset
    10
  "==>"  ("\<^raw:\mbox{}\inferrule{\mbox{>_\<^raw:}}>\<^raw:{\mbox{>_\<^raw:}}>")
dcde836219bc add thy files
chunhan
parents:
diff changeset
    11
dcde836219bc add thy files
chunhan
parents:
diff changeset
    12
syntax (Rule output)
dcde836219bc add thy files
chunhan
parents:
diff changeset
    13
  "_bigimpl" :: "asms \<Rightarrow> prop \<Rightarrow> prop"
dcde836219bc add thy files
chunhan
parents:
diff changeset
    14
  ("\<^raw:\mbox{}\inferrule{>_\<^raw:}>\<^raw:{\mbox{>_\<^raw:}}>")
dcde836219bc add thy files
chunhan
parents:
diff changeset
    15
dcde836219bc add thy files
chunhan
parents:
diff changeset
    16
  "_asms" :: "prop \<Rightarrow> asms \<Rightarrow> asms" 
dcde836219bc add thy files
chunhan
parents:
diff changeset
    17
  ("\<^raw:\mbox{>_\<^raw:}\\>/ _")
dcde836219bc add thy files
chunhan
parents:
diff changeset
    18
dcde836219bc add thy files
chunhan
parents:
diff changeset
    19
  "_asm" :: "prop \<Rightarrow> asms" ("\<^raw:\mbox{>_\<^raw:}>")
dcde836219bc add thy files
chunhan
parents:
diff changeset
    20
dcde836219bc add thy files
chunhan
parents:
diff changeset
    21
notation (Axiom output)
dcde836219bc add thy files
chunhan
parents:
diff changeset
    22
  "Trueprop"  ("\<^raw:\mbox{}\inferrule{\mbox{}}{\mbox{>_\<^raw:}}>")
dcde836219bc add thy files
chunhan
parents:
diff changeset
    23
dcde836219bc add thy files
chunhan
parents:
diff changeset
    24
notation (IfThen output)
dcde836219bc add thy files
chunhan
parents:
diff changeset
    25
  "==>"  ("\<^raw:{\normalsize{}>If\<^raw:\,}> _/ \<^raw:{\normalsize \,>then\<^raw:\,}>/ _.")
dcde836219bc add thy files
chunhan
parents:
diff changeset
    26
syntax (IfThen output)
dcde836219bc add thy files
chunhan
parents:
diff changeset
    27
  "_bigimpl" :: "asms \<Rightarrow> prop \<Rightarrow> prop"
dcde836219bc add thy files
chunhan
parents:
diff changeset
    28
  ("\<^raw:{\normalsize{}>If\<^raw:\,}> _ /\<^raw:{\normalsize \,>then\<^raw:\,}>/ _.")
dcde836219bc add thy files
chunhan
parents:
diff changeset
    29
  "_asms" :: "prop \<Rightarrow> asms \<Rightarrow> asms" ("\<^raw:\mbox{>_\<^raw:}> /\<^raw:{\normalsize \,>and\<^raw:\,}>/ _")
dcde836219bc add thy files
chunhan
parents:
diff changeset
    30
  "_asm" :: "prop \<Rightarrow> asms" ("\<^raw:\mbox{>_\<^raw:}>")
dcde836219bc add thy files
chunhan
parents:
diff changeset
    31
dcde836219bc add thy files
chunhan
parents:
diff changeset
    32
notation (IfThenNoBox output)
dcde836219bc add thy files
chunhan
parents:
diff changeset
    33
  "==>"  ("\<^raw:{\normalsize{}>If\<^raw:\,}> _/ \<^raw:{\normalsize \,>then\<^raw:\,}>/ _.")
dcde836219bc add thy files
chunhan
parents:
diff changeset
    34
syntax (IfThenNoBox output)
dcde836219bc add thy files
chunhan
parents:
diff changeset
    35
  "_bigimpl" :: "asms \<Rightarrow> prop \<Rightarrow> prop"
dcde836219bc add thy files
chunhan
parents:
diff changeset
    36
  ("\<^raw:{\normalsize{}>If\<^raw:\,}> _ /\<^raw:{\normalsize \,>then\<^raw:\,}>/ _.")
dcde836219bc add thy files
chunhan
parents:
diff changeset
    37
  "_asms" :: "prop \<Rightarrow> asms \<Rightarrow> asms" ("_ /\<^raw:{\normalsize \,>and\<^raw:\,}>/ _")
dcde836219bc add thy files
chunhan
parents:
diff changeset
    38
  "_asm" :: "prop \<Rightarrow> asms" ("_")
dcde836219bc add thy files
chunhan
parents:
diff changeset
    39
dcde836219bc add thy files
chunhan
parents:
diff changeset
    40
(* insert *)
dcde836219bc add thy files
chunhan
parents:
diff changeset
    41
notation (latex)
dcde836219bc add thy files
chunhan
parents:
diff changeset
    42
  "Set.empty" ("\<emptyset>")
dcde836219bc add thy files
chunhan
parents:
diff changeset
    43
dcde836219bc add thy files
chunhan
parents:
diff changeset
    44
translations 
dcde836219bc add thy files
chunhan
parents:
diff changeset
    45
  "{x} \<union> A" <= "CONST insert x A"
dcde836219bc add thy files
chunhan
parents:
diff changeset
    46
  "{x,y}" <= "{x} \<union> {y}"
dcde836219bc add thy files
chunhan
parents:
diff changeset
    47
  "{x,y} \<union> A" <= "{x} \<union> ({y} \<union> A)"
dcde836219bc add thy files
chunhan
parents:
diff changeset
    48
  "{x}" <= "{x} \<union> \<emptyset>"
dcde836219bc add thy files
chunhan
parents:
diff changeset
    49
dcde836219bc add thy files
chunhan
parents:
diff changeset
    50
lemma impeq:
dcde836219bc add thy files
chunhan
parents:
diff changeset
    51
  "A = B \<Longrightarrow> (B \<Longrightarrow> A)"
dcde836219bc add thy files
chunhan
parents:
diff changeset
    52
by auto
dcde836219bc add thy files
chunhan
parents:
diff changeset
    53
dcde836219bc add thy files
chunhan
parents:
diff changeset
    54
dcde836219bc add thy files
chunhan
parents:
diff changeset
    55
dcde836219bc add thy files
chunhan
parents:
diff changeset
    56
dcde836219bc add thy files
chunhan
parents:
diff changeset
    57
consts DUMMY::'a
dcde836219bc add thy files
chunhan
parents:
diff changeset
    58
dcde836219bc add thy files
chunhan
parents:
diff changeset
    59
abbreviation
dcde836219bc add thy files
chunhan
parents:
diff changeset
    60
  "is_parent f pf \<equiv> (parent f = Some pf)"
dcde836219bc add thy files
chunhan
parents:
diff changeset
    61
dcde836219bc add thy files
chunhan
parents:
diff changeset
    62
context tainting_s_sound begin 
dcde836219bc add thy files
chunhan
parents:
diff changeset
    63
dcde836219bc add thy files
chunhan
parents:
diff changeset
    64
notation (latex output)
dcde836219bc add thy files
chunhan
parents:
diff changeset
    65
  source_dir ("anchor") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    66
  SProc ("P_\<^bsup>_\<^esup>") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    67
  SFile ("F_\<^bsup>_\<^esup>") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    68
  SIPC ("I'(_')\<^bsup>_\<^esup>") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    69
  READ ("Read") and 
dcde836219bc add thy files
chunhan
parents:
diff changeset
    70
  WRITE ("Write") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    71
  EXECUTE ("Execute") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    72
  CHANGE_OWNER ("ChangeOwner") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    73
  CREATE ("Create") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    74
  SEND ("Send") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    75
  RECEIVE ("Receive") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    76
  DELETE ("Delete") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    77
  compatible ("permissions") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    78
  comproles ("compatible") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    79
  DUMMY  ("\<^raw:\mbox{$\_$}>") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    80
  Cons ("_::_" [78,77] 79) and 
dcde836219bc add thy files
chunhan
parents:
diff changeset
    81
  Proc ("") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    82
  File ("") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    83
  File_type ("") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    84
  Proc_type ("") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    85
  IPC ("") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    86
  init_processes ("init'_procs") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    87
  os_grant ("admissible") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    88
  rc_grant ("granted") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    89
  exists ("alive") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    90
  default_fd_create_type ("default'_type") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    91
  InheritParent_file_type ("InheritPatentType") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    92
  NormalFile_type ("NormalFileType") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    93
  deleted ("deleted _ _" [50, 100] 100) and
13
dd1499f296ea updated to new isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 11
diff changeset
    94
  taintable_s ("taintable\<^sup>s") and
dd1499f296ea updated to new isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 11
diff changeset
    95
  tainted_s ("tainted\<^sup>s") and
dd1499f296ea updated to new isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 11
diff changeset
    96
  all_sobjs ("reachable\<^sup>s") and
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
    97
  init_obj2sobj ("\<lbrakk>_\<rbrakk>") and
dcde836219bc add thy files
chunhan
parents:
diff changeset
    98
  erole_functor ("erole'_aux") --"I have a erole_functor and etype_aux to handle 
dcde836219bc add thy files
chunhan
parents:
diff changeset
    99
                                 efficient, but their name not same, so ..., but don't work"
dcde836219bc add thy files
chunhan
parents:
diff changeset
   100
dcde836219bc add thy files
chunhan
parents:
diff changeset
   101
dcde836219bc add thy files
chunhan
parents:
diff changeset
   102
abbreviation
dcde836219bc add thy files
chunhan
parents:
diff changeset
   103
  "is_process_type s p t \<equiv> (type_of_process s p = Some t)"
dcde836219bc add thy files
chunhan
parents:
diff changeset
   104
dcde836219bc add thy files
chunhan
parents:
diff changeset
   105
abbreviation
dcde836219bc add thy files
chunhan
parents:
diff changeset
   106
  "is_current_role s p r \<equiv> (currentrole s p = Some r)"
dcde836219bc add thy files
chunhan
parents:
diff changeset
   107
dcde836219bc add thy files
chunhan
parents:
diff changeset
   108
abbreviation
dcde836219bc add thy files
chunhan
parents:
diff changeset
   109
  "is_file_type s f t \<equiv> (etype_of_file s f = Some t)"
dcde836219bc add thy files
chunhan
parents:
diff changeset
   110
dcde836219bc add thy files
chunhan
parents:
diff changeset
   111
lemma osgrant2:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   112
  "\<lbrakk>p \<in> current_procs \<tau>; f \<notin> current_files \<tau>; parent f = Some pf; pf \<in> current_files \<tau>\<rbrakk> \<Longrightarrow>
dcde836219bc add thy files
chunhan
parents:
diff changeset
   113
   os_grant \<tau> (CreateFile p f)"
dcde836219bc add thy files
chunhan
parents:
diff changeset
   114
by simp
dcde836219bc add thy files
chunhan
parents:
diff changeset
   115
dcde836219bc add thy files
chunhan
parents:
diff changeset
   116
lemma osgrant6:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   117
 "\<lbrakk>p \<in> current_procs \<tau>; u \<in> init_users\<rbrakk> \<Longrightarrow> os_grant \<tau> (ChangeOwner p u)"
dcde836219bc add thy files
chunhan
parents:
diff changeset
   118
by simp
dcde836219bc add thy files
chunhan
parents:
diff changeset
   119
8
2dab4bbb6684 fixed typos
chunhan
parents: 3
diff changeset
   120
lemma osgrant10: (* modified by chunhan *)
2dab4bbb6684 fixed typos
chunhan
parents: 3
diff changeset
   121
  "\<lbrakk>p \<in> current_procs \<tau>; p' \<notin> current_procs \<tau>\<rbrakk> \<Longrightarrow> os_grant \<tau> (Clone p p')"
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
   122
by simp 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   123
dcde836219bc add thy files
chunhan
parents:
diff changeset
   124
dcde836219bc add thy files
chunhan
parents:
diff changeset
   125
lemma rcgrant1:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   126
  "\<lbrakk>is_parent f pf; is_file_type s pf t; is_current_role s p r;
dcde836219bc add thy files
chunhan
parents:
diff changeset
   127
    default_fd_create_type r = InheritParent_file_type; 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   128
    (r, File_type t, WRITE) \<in> compatible\<rbrakk>
dcde836219bc add thy files
chunhan
parents:
diff changeset
   129
   \<Longrightarrow> rc_grant s (CreateFile p f)"
dcde836219bc add thy files
chunhan
parents:
diff changeset
   130
by simp
dcde836219bc add thy files
chunhan
parents:
diff changeset
   131
dcde836219bc add thy files
chunhan
parents:
diff changeset
   132
lemma rcgrant1':
dcde836219bc add thy files
chunhan
parents:
diff changeset
   133
  "\<lbrakk>is_parent f pf; is_file_type s pf t; is_current_role s p r; 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   134
    default_fd_create_type r = NormalFile_type t'; 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   135
    (r, File_type t, WRITE) \<in> compatible;
dcde836219bc add thy files
chunhan
parents:
diff changeset
   136
    (r, File_type t', CREATE) \<in> compatible\<rbrakk>
dcde836219bc add thy files
chunhan
parents:
diff changeset
   137
   \<Longrightarrow> rc_grant s (CreateFile p f)"
dcde836219bc add thy files
chunhan
parents:
diff changeset
   138
by simp
dcde836219bc add thy files
chunhan
parents:
diff changeset
   139
dcde836219bc add thy files
chunhan
parents:
diff changeset
   140
lemma rcgrant4:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   141
  "\<lbrakk>is_current_role s p r; is_file_type s f t; (r, File_type t, EXECUTE) \<in> compatible\<rbrakk>
dcde836219bc add thy files
chunhan
parents:
diff changeset
   142
   \<Longrightarrow> rc_grant s (Execute p f)"
dcde836219bc add thy files
chunhan
parents:
diff changeset
   143
by simp
dcde836219bc add thy files
chunhan
parents:
diff changeset
   144
dcde836219bc add thy files
chunhan
parents:
diff changeset
   145
lemma rcgrant7: 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   146
  "\<lbrakk>is_current_role s p r; r' \<in> comproles r\<rbrakk> \<Longrightarrow> rc_grant s (ChangeRole p r')"
dcde836219bc add thy files
chunhan
parents:
diff changeset
   147
by simp
dcde836219bc add thy files
chunhan
parents:
diff changeset
   148
dcde836219bc add thy files
chunhan
parents:
diff changeset
   149
lemma rcgrant_CHO:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   150
"\<lbrakk>is_current_role s p r; 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   151
  type_of_process s p = Some t;
dcde836219bc add thy files
chunhan
parents:
diff changeset
   152
  (r, Proc_type t, CHANGE_OWNER) \<in> compatible\<rbrakk> \<Longrightarrow> rc_grant s (ChangeOwner p u)"
dcde836219bc add thy files
chunhan
parents:
diff changeset
   153
by(simp)
dcde836219bc add thy files
chunhan
parents:
diff changeset
   154
dcde836219bc add thy files
chunhan
parents:
diff changeset
   155
lemma pf_in_current_paper:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   156
  "\<lbrakk>is_parent f pf; f \<in> current_files s; valid s\<rbrakk> \<Longrightarrow> pf \<in> current_files s"
dcde836219bc add thy files
chunhan
parents:
diff changeset
   157
by (simp add:parent_file_in_current)
dcde836219bc add thy files
chunhan
parents:
diff changeset
   158
dcde836219bc add thy files
chunhan
parents:
diff changeset
   159
lemma dels:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   160
  shows "deleted (Proc p') ((Kill p p')#s)" 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   161
  and   "deleted (File f) ((DeleteFile p f)#s)" 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   162
  and   "deleted (IPC i) ((DeleteIPC p i)#s)"
dcde836219bc add thy files
chunhan
parents:
diff changeset
   163
  and   "deleted obj s \<Longrightarrow> deleted obj (e#s)"
dcde836219bc add thy files
chunhan
parents:
diff changeset
   164
apply simp_all
dcde836219bc add thy files
chunhan
parents:
diff changeset
   165
apply(case_tac e)
dcde836219bc add thy files
chunhan
parents:
diff changeset
   166
apply(simp_all)
dcde836219bc add thy files
chunhan
parents:
diff changeset
   167
done
dcde836219bc add thy files
chunhan
parents:
diff changeset
   168
dcde836219bc add thy files
chunhan
parents:
diff changeset
   169
lemma tainted_10:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   170
  "\<lbrakk>(File f) \<in> tainted s; valid (e # s); f \<in> current_files (e # s)\<rbrakk> 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   171
  \<Longrightarrow> (File f) \<in> tainted (e # s)"
dcde836219bc add thy files
chunhan
parents:
diff changeset
   172
apply(rule tainted.intros)
dcde836219bc add thy files
chunhan
parents:
diff changeset
   173
apply(assumption)
dcde836219bc add thy files
chunhan
parents:
diff changeset
   174
apply(assumption)
dcde836219bc add thy files
chunhan
parents:
diff changeset
   175
apply(simp only: exists.simps)
dcde836219bc add thy files
chunhan
parents:
diff changeset
   176
done
dcde836219bc add thy files
chunhan
parents:
diff changeset
   177
dcde836219bc add thy files
chunhan
parents:
diff changeset
   178
definition
dcde836219bc add thy files
chunhan
parents:
diff changeset
   179
  Init ("init _")
dcde836219bc add thy files
chunhan
parents:
diff changeset
   180
where
dcde836219bc add thy files
chunhan
parents:
diff changeset
   181
  "Init obj \<equiv> exists [] obj" 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   182
dcde836219bc add thy files
chunhan
parents:
diff changeset
   183
lemma Init_rhs:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   184
  shows "Init (File f) = (f \<in> init_files)"
dcde836219bc add thy files
chunhan
parents:
diff changeset
   185
  and   "Init (Proc p) = (p \<in> init_processes)"
dcde836219bc add thy files
chunhan
parents:
diff changeset
   186
  and   "Init (IPC i) = (i \<in> init_ipcs)"
dcde836219bc add thy files
chunhan
parents:
diff changeset
   187
unfolding Init_def
dcde836219bc add thy files
chunhan
parents:
diff changeset
   188
by(simp_all)
dcde836219bc add thy files
chunhan
parents:
diff changeset
   189
dcde836219bc add thy files
chunhan
parents:
diff changeset
   190
notation (latex output)
dcde836219bc add thy files
chunhan
parents:
diff changeset
   191
  Init ("_ \<in> init")
dcde836219bc add thy files
chunhan
parents:
diff changeset
   192
dcde836219bc add thy files
chunhan
parents:
diff changeset
   193
lemma af_init':
dcde836219bc add thy files
chunhan
parents:
diff changeset
   194
  "\<lbrakk>f \<in> init_files; is_file_type [] f t\<rbrakk>
dcde836219bc add thy files
chunhan
parents:
diff changeset
   195
  \<Longrightarrow> SFile (t, f) (Some f) \<in> all_sobjs"
dcde836219bc add thy files
chunhan
parents:
diff changeset
   196
apply(rule af_init)
dcde836219bc add thy files
chunhan
parents:
diff changeset
   197
apply(simp)
dcde836219bc add thy files
chunhan
parents:
diff changeset
   198
by (simp add:etype_of_file_def)
dcde836219bc add thy files
chunhan
parents:
diff changeset
   199
dcde836219bc add thy files
chunhan
parents:
diff changeset
   200
declare [[show_question_marks = false]]
dcde836219bc add thy files
chunhan
parents:
diff changeset
   201
dcde836219bc add thy files
chunhan
parents:
diff changeset
   202
dcde836219bc add thy files
chunhan
parents:
diff changeset
   203
(*>*)
dcde836219bc add thy files
chunhan
parents:
diff changeset
   204
dcde836219bc add thy files
chunhan
parents:
diff changeset
   205
section {* Introduction *}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   206
dcde836219bc add thy files
chunhan
parents:
diff changeset
   207
text {*
dcde836219bc add thy files
chunhan
parents:
diff changeset
   208
  Role-based access control models are used in many operating systems
dcde836219bc add thy files
chunhan
parents:
diff changeset
   209
  for enforcing security properties.  The
dcde836219bc add thy files
chunhan
parents:
diff changeset
   210
  \emph{Role-Compatibility Model} (RC-Model), introduced by Ott
dcde836219bc add thy files
chunhan
parents:
diff changeset
   211
  \cite{ottrc,ottthesis}, is one such role-based access control
dcde836219bc add thy files
chunhan
parents:
diff changeset
   212
  model. It defines \emph{roles}, which are associated with processes,
dcde836219bc add thy files
chunhan
parents:
diff changeset
   213
  and defines \emph{types}, which are associated with system
dcde836219bc add thy files
chunhan
parents:
diff changeset
   214
  resources, such as files and directories. The RC-Model also includes
dcde836219bc add thy files
chunhan
parents:
diff changeset
   215
  types for interprocess communication, that is message queues,
dcde836219bc add thy files
chunhan
parents:
diff changeset
   216
  sockets and shared memory. A policy in the RC-Model gives every user
dcde836219bc add thy files
chunhan
parents:
diff changeset
   217
  a default role, and also specifies how roles can be
dcde836219bc add thy files
chunhan
parents:
diff changeset
   218
  changed. Moreover, it specifies which types of resources a role has
dcde836219bc add thy files
chunhan
parents:
diff changeset
   219
  permission to access, and also the \emph{mode} with which the role
dcde836219bc add thy files
chunhan
parents:
diff changeset
   220
  can access the resources, for example read, write, send, receive and
dcde836219bc add thy files
chunhan
parents:
diff changeset
   221
  so on.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   222
   
dcde836219bc add thy files
chunhan
parents:
diff changeset
   223
  The RC-Model is built on top of a collection of system calls
dcde836219bc add thy files
chunhan
parents:
diff changeset
   224
  provided by the operating system, for instance system calls for
dcde836219bc add thy files
chunhan
parents:
diff changeset
   225
  reading and writing files, cloning and killing of processes, and
dcde836219bc add thy files
chunhan
parents:
diff changeset
   226
  sending and receiving messages. The purpose of the RC-Model is to
dcde836219bc add thy files
chunhan
parents:
diff changeset
   227
  restrict access to these system calls and thereby enforce security
dcde836219bc add thy files
chunhan
parents:
diff changeset
   228
  properties of the system. A problem with the RC-Model and role-based
dcde836219bc add thy files
chunhan
parents:
diff changeset
   229
  access control models in general is that a system administrator has
dcde836219bc add thy files
chunhan
parents:
diff changeset
   230
  to specify an appropriate access control policy. The difficulty with
dcde836219bc add thy files
chunhan
parents:
diff changeset
   231
  this is that \emph{``what you specify is what you get but not
dcde836219bc add thy files
chunhan
parents:
diff changeset
   232
  necessarily what you want''} \cite[Page 242]{Jha08}. To overcome
dcde836219bc add thy files
chunhan
parents:
diff changeset
   233
  this difficulty, a system administrator needs some kind of sanity
dcde836219bc add thy files
chunhan
parents:
diff changeset
   234
  check for whether an access control policy is really securing
dcde836219bc add thy files
chunhan
parents:
diff changeset
   235
  resources.  Existing works, for example \cite{sanity01,sanity02},
dcde836219bc add thy files
chunhan
parents:
diff changeset
   236
  provide sanity checks for policies by specifying properties and
dcde836219bc add thy files
chunhan
parents:
diff changeset
   237
  using model checking techniques to ensure a policy at hand satisfies
dcde836219bc add thy files
chunhan
parents:
diff changeset
   238
  these properties. However, these checks only address the problem on
dcde836219bc add thy files
chunhan
parents:
diff changeset
   239
  the level of policies---they can only check ``on the surface''
dcde836219bc add thy files
chunhan
parents:
diff changeset
   240
  whether the policy reflects the intentions of the system
dcde836219bc add thy files
chunhan
parents:
diff changeset
   241
  administrator---these checks are not justified by the actual
dcde836219bc add thy files
chunhan
parents:
diff changeset
   242
  behaviour of the operating system. The main problem this paper addresses is to check
dcde836219bc add thy files
chunhan
parents:
diff changeset
   243
  when a policy matches the intentions of a system administrator
dcde836219bc add thy files
chunhan
parents:
diff changeset
   244
  \emph{and} given such a policy, the operating system actually
dcde836219bc add thy files
chunhan
parents:
diff changeset
   245
  enforces this policy.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   246
 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   247
  Our work is related to the preliminary work by Archer et al
dcde836219bc add thy files
chunhan
parents:
diff changeset
   248
  \cite{Archer03} about the security model of SELinux. 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   249
  They also give a dynamic model of system calls on which the access
dcde836219bc add thy files
chunhan
parents:
diff changeset
   250
  controls are implemented. Their dynamic model is defined in terms of
dcde836219bc add thy files
chunhan
parents:
diff changeset
   251
  IO automata and mechanised in the PVS theorem prover. For specifying
dcde836219bc add thy files
chunhan
parents:
diff changeset
   252
  and reasoning about automata they use the TAME tool in PVS. Their work checks
dcde836219bc add thy files
chunhan
parents:
diff changeset
   253
  well-formedness properties of access policies by type-checking 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   254
  generated definitions in PVS. They can also ensure some ``\emph{simple
dcde836219bc add thy files
chunhan
parents:
diff changeset
   255
  properties}'' (their terminology), for example whether a process
dcde836219bc add thy files
chunhan
parents:
diff changeset
   256
  with a particular PID is present in every reachable state from 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   257
  an initial state. They also consider ``\emph{deeper properties}'', for
dcde836219bc add thy files
chunhan
parents:
diff changeset
   258
  example whether only a process with root-permissions 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   259
  or one of its descendents ever gets permission to write to kernel
dcde836219bc add thy files
chunhan
parents:
diff changeset
   260
  log files. They write that they can state such deeper 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   261
  properties about access policies, but about checking such properties
dcde836219bc add thy files
chunhan
parents:
diff changeset
   262
  they write that ``\emph{the feasibility of doing 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   263
  so is currently an open question}'' \cite[Page 167]{Archer03}.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   264
  We improve upon their results by using our sound and complete 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   265
  static policy check to make this feasible. 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   266
dcde836219bc add thy files
chunhan
parents:
diff changeset
   267
  Our formal models and correctness proofs are mechanised in the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   268
  interactive theorem prover Isabelle/HOL. The mechanisation of the models is a
dcde836219bc add thy files
chunhan
parents:
diff changeset
   269
  prerequisite for any correctness proof about the RC-Model, since it
dcde836219bc add thy files
chunhan
parents:
diff changeset
   270
  includes a large number of interdependent concepts and very complex
dcde836219bc add thy files
chunhan
parents:
diff changeset
   271
  operations that determine roles and types. In our opinion it is
dcde836219bc add thy files
chunhan
parents:
diff changeset
   272
  futile to attempt to reason about them by just using ``pencil-and-paper''.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   273
  Following good experience in earlier mechanisation work
dcde836219bc add thy files
chunhan
parents:
diff changeset
   274
  \cite{ZhangUrbanWu12}, we use Paulson's inductive method for
dcde836219bc add thy files
chunhan
parents:
diff changeset
   275
  reasoning about sequences of events \cite{Paulson98}.  For example
dcde836219bc add thy files
chunhan
parents:
diff changeset
   276
  we model system calls as events and reason about an inductive
dcde836219bc add thy files
chunhan
parents:
diff changeset
   277
  definition of valid traces, that is lists of events.  Central to
dcde836219bc add thy files
chunhan
parents:
diff changeset
   278
  this paper is a notion of a resource being \emph{tainted}, which for
dcde836219bc add thy files
chunhan
parents:
diff changeset
   279
  example means it contains a virus or a back door.  We use our model
dcde836219bc add thy files
chunhan
parents:
diff changeset
   280
  of system calls in order to characterise how such a tainted object
dcde836219bc add thy files
chunhan
parents:
diff changeset
   281
  can ``spread'' through the system.  For a system administrator the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   282
  important question is whether such a tainted file, possibly
dcde836219bc add thy files
chunhan
parents:
diff changeset
   283
  introduced by a user, can affect core system files and render the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   284
  whole system insecure, or whether it can be contained by the access
dcde836219bc add thy files
chunhan
parents:
diff changeset
   285
  policy. Our results show that a corresponding check can be performed
dcde836219bc add thy files
chunhan
parents:
diff changeset
   286
  statically by analysing the initial state of the system and the access policy.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   287
  \smallskip
dcde836219bc add thy files
chunhan
parents:
diff changeset
   288
 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   289
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   290
  {\bf Contributions:} 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   291
  We give a complete formalisation of the RC-Model in the interactive
dcde836219bc add thy files
chunhan
parents:
diff changeset
   292
  theorem prover Isabelle/HOL.  We also give a dynamic model of the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   293
  operating system by formalising all security related events that can
dcde836219bc add thy files
chunhan
parents:
diff changeset
   294
  happen while the system is running.  As far as we are aware, we are
dcde836219bc add thy files
chunhan
parents:
diff changeset
   295
  the first ones who formally prove that if a policy in the RC-Model
dcde836219bc add thy files
chunhan
parents:
diff changeset
   296
  satisfies an access property, then there is no sequence of events
dcde836219bc add thy files
chunhan
parents:
diff changeset
   297
  (system calls) that can violate this access property.  We also prove
dcde836219bc add thy files
chunhan
parents:
diff changeset
   298
  the opposite: if a policy does not meet an access property, then
dcde836219bc add thy files
chunhan
parents:
diff changeset
   299
  there is a sequence of events that will violate this property in our
dcde836219bc add thy files
chunhan
parents:
diff changeset
   300
  model of the operating system.  With these two results in place we
dcde836219bc add thy files
chunhan
parents:
diff changeset
   301
  can show that a static policy check is sufficient in order to
dcde836219bc add thy files
chunhan
parents:
diff changeset
   302
  guarantee the access properties before running the system. Again as
10
569222a42cf5 updated the paper for submission
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 8
diff changeset
   303
  far as we know, no such check has been designed and proved correct 
569222a42cf5 updated the paper for submission
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 8
diff changeset
   304
  before.
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
   305
  
dcde836219bc add thy files
chunhan
parents:
diff changeset
   306
dcde836219bc add thy files
chunhan
parents:
diff changeset
   307
  %Specified dynamic behaviour of the system; 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   308
  %we specified a static AC model; designed a tainted relation for 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   309
  %the system; proved that they coincide.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   310
  %In our paper ....
dcde836219bc add thy files
chunhan
parents:
diff changeset
   311
   
dcde836219bc add thy files
chunhan
parents:
diff changeset
   312
*}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   313
  
dcde836219bc add thy files
chunhan
parents:
diff changeset
   314
section {* Preliminaries about the RC-Model *}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   315
dcde836219bc add thy files
chunhan
parents:
diff changeset
   316
dcde836219bc add thy files
chunhan
parents:
diff changeset
   317
text {*
dcde836219bc add thy files
chunhan
parents:
diff changeset
   318
  The Role-Compatibility Model (RC-Model) is a role-based access
dcde836219bc add thy files
chunhan
parents:
diff changeset
   319
  control model. It has been introduced by Ott \cite{ottrc} and is
dcde836219bc add thy files
chunhan
parents:
diff changeset
   320
  used in running systems for example to secure Apache servers. It
dcde836219bc add thy files
chunhan
parents:
diff changeset
   321
  provides a more fine-grained control over access permissions than
dcde836219bc add thy files
chunhan
parents:
diff changeset
   322
  simple Unix-style access control models. This more fine-grained
dcde836219bc add thy files
chunhan
parents:
diff changeset
   323
  control solves the problem of server processes running as root with
dcde836219bc add thy files
chunhan
parents:
diff changeset
   324
  too many access permissions in order to accomplish a task at
dcde836219bc add thy files
chunhan
parents:
diff changeset
   325
  hand. In the RC-Model, system administrators are able to restrict
dcde836219bc add thy files
chunhan
parents:
diff changeset
   326
  what the role of server is allowed to do and in doing so reduce the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   327
  attack surface of a system.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   328
  
dcde836219bc add thy files
chunhan
parents:
diff changeset
   329
  Policies in the RC-Model talk about \emph{users}, \emph{roles},
dcde836219bc add thy files
chunhan
parents:
diff changeset
   330
  \emph{types} and \emph{objects}.  Objects are processes, files or
dcde836219bc add thy files
chunhan
parents:
diff changeset
   331
  IPCs (interprocess communication objects---such as message queues,
dcde836219bc add thy files
chunhan
parents:
diff changeset
   332
  sockets and shared memory). Objects are the resources of a system an
dcde836219bc add thy files
chunhan
parents:
diff changeset
   333
  RC-policy can restrict access to.  In what follows we use the letter
dcde836219bc add thy files
chunhan
parents:
diff changeset
   334
  @{term u} to stand for users, @{text r} for roles, @{term p} for
dcde836219bc add thy files
chunhan
parents:
diff changeset
   335
  processes, @{term f} for files and @{term i} for IPCs. We also
dcde836219bc add thy files
chunhan
parents:
diff changeset
   336
  use @{text obj} as a generic variable for objects.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   337
  The RC-Model has the following eight kinds of access modes to objects:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   338
dcde836219bc add thy files
chunhan
parents:
diff changeset
   339
  \begin{isabelle}\ \ \ \ \ %%%
dcde836219bc add thy files
chunhan
parents:
diff changeset
   340
  \begin{tabular}{@ {}l}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   341
  @{term READ}, @{term WRITE}, @{term EXECUTE}, @{term "CHANGE_OWNER"}, 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   342
  @{term CREATE}, @{term SEND}, @{term RECEIVE} and @{term DELETE}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   343
  \end{tabular}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   344
  \end{isabelle}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   345
dcde836219bc add thy files
chunhan
parents:
diff changeset
   346
  In the RC-Model, roles group users according to tasks they need to 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   347
  accomplish. Users have a default role specified by the policy,
dcde836219bc add thy files
chunhan
parents:
diff changeset
   348
  which is the role they start with whenever they log into the system.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   349
  A process contains the information about its owner (a user), its
dcde836219bc add thy files
chunhan
parents:
diff changeset
   350
  role and its type, whereby a type in the RC-Model allows system
dcde836219bc add thy files
chunhan
parents:
diff changeset
   351
  administrators to group resources according to a common criteria.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   352
  Such detailed information is needed in the RC-Model, for example, in
dcde836219bc add thy files
chunhan
parents:
diff changeset
   353
  order to allow a process to change its ownership. For this the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   354
  RC-Model checks the role of the process and its type: if the access
dcde836219bc add thy files
chunhan
parents:
diff changeset
   355
  control policy states that the role has @{term CHANGE_OWNER} access mode for
dcde836219bc add thy files
chunhan
parents:
diff changeset
   356
  processes of that type, then the process is permitted to assume a
dcde836219bc add thy files
chunhan
parents:
diff changeset
   357
  new owner.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   358
dcde836219bc add thy files
chunhan
parents:
diff changeset
   359
  Files in the RC-Model contain the information about their types.  A
dcde836219bc add thy files
chunhan
parents:
diff changeset
   360
  policy then specifies whether a process with a given role can access
dcde836219bc add thy files
chunhan
parents:
diff changeset
   361
  a file under a certain access mode. Files, however, also
dcde836219bc add thy files
chunhan
parents:
diff changeset
   362
  include in the RC-Model information about roles. This information is
dcde836219bc add thy files
chunhan
parents:
diff changeset
   363
  used when a process is permitted to execute a file. By doing so it
dcde836219bc add thy files
chunhan
parents:
diff changeset
   364
  might change its role. This is often used in the context of
dcde836219bc add thy files
chunhan
parents:
diff changeset
   365
  web-servers when a cgi-script is uploaded and then executed by the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   366
  server.  The resulting process should have much more restricted
dcde836219bc add thy files
chunhan
parents:
diff changeset
   367
  access permissions.  This kind of behaviour when executing a file can
dcde836219bc add thy files
chunhan
parents:
diff changeset
   368
  be specified in an RC-policy in several ways: first, the role of the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   369
  process does not change when executing a file; second, the process
dcde836219bc add thy files
chunhan
parents:
diff changeset
   370
  takes on the role specified with the file; or third, use the role of
dcde836219bc add thy files
chunhan
parents:
diff changeset
   371
  the owner, who currently owns this process. The RC-Model also makes
dcde836219bc add thy files
chunhan
parents:
diff changeset
   372
  assumptions on how types can change.  For example for files and IPCs
dcde836219bc add thy files
chunhan
parents:
diff changeset
   373
  the type can never change once they are created. But processes can
dcde836219bc add thy files
chunhan
parents:
diff changeset
   374
  change their types according to the roles they have.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   375
  
dcde836219bc add thy files
chunhan
parents:
diff changeset
   376
  As can be seen, the information contained in a policy in the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   377
  RC-Model can be rather complex: Roles and types, for example, are
dcde836219bc add thy files
chunhan
parents:
diff changeset
   378
  policy-dependent, meaning each policy needs to define a set of roles and a
dcde836219bc add thy files
chunhan
parents:
diff changeset
   379
  set of types. Apart from recording for each role the information
dcde836219bc add thy files
chunhan
parents:
diff changeset
   380
  which type of resource it can access and under which access-mode, it
dcde836219bc add thy files
chunhan
parents:
diff changeset
   381
  also needs to include a role compatibility set. This set specifies how one
dcde836219bc add thy files
chunhan
parents:
diff changeset
   382
  role can change into another role. Moreover it needs to include default
dcde836219bc add thy files
chunhan
parents:
diff changeset
   383
  information for cases when new processes or files are created.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   384
  For example, when a process clones itself, the type of the new
dcde836219bc add thy files
chunhan
parents:
diff changeset
   385
  process is determined as follows: the policy might specify a default
dcde836219bc add thy files
chunhan
parents:
diff changeset
   386
  type whenever a process with a certain role is cloned, or the policy
dcde836219bc add thy files
chunhan
parents:
diff changeset
   387
  might specify that the cloned process inherits the type of the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   388
  parent process.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   389
  
dcde836219bc add thy files
chunhan
parents:
diff changeset
   390
  Ott implemented the RC-Model on top of Linux, but only specified it
dcde836219bc add thy files
chunhan
parents:
diff changeset
   391
  as a set of informal rules, partially given as logic formulas,
dcde836219bc add thy files
chunhan
parents:
diff changeset
   392
  partially given as rules in ``English''. Unfortunately, some
dcde836219bc add thy files
chunhan
parents:
diff changeset
   393
  presentations about the RC-Model give conflicting definitions for
dcde836219bc add thy files
chunhan
parents:
diff changeset
   394
  some concepts---for example when defining the semantics of the special role
dcde836219bc add thy files
chunhan
parents:
diff changeset
   395
  ``inherit parent''. In \cite{ottrc} it means inherit the initial role
dcde836219bc add thy files
chunhan
parents:
diff changeset
   396
  of the parent directory, but in \cite{ottweb} it means inherit
dcde836219bc add thy files
chunhan
parents:
diff changeset
   397
  the role of the parent process.  In our formalisation we mainly follow the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   398
  version given in \cite{ottrc}. In the next section we give a mechanised
dcde836219bc add thy files
chunhan
parents:
diff changeset
   399
  model of the system calls on which the RC-Model is implemented.  
dcde836219bc add thy files
chunhan
parents:
diff changeset
   400
*}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   401
dcde836219bc add thy files
chunhan
parents:
diff changeset
   402
dcde836219bc add thy files
chunhan
parents:
diff changeset
   403
dcde836219bc add thy files
chunhan
parents:
diff changeset
   404
section {* Dynamic Model of System Calls *}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   405
dcde836219bc add thy files
chunhan
parents:
diff changeset
   406
text {*
dcde836219bc add thy files
chunhan
parents:
diff changeset
   407
  Central to the RC-Model are processes, since they initiate any action
dcde836219bc add thy files
chunhan
parents:
diff changeset
   408
  involving resources and access control. We use natural numbers to stand for process IDs,
dcde836219bc add thy files
chunhan
parents:
diff changeset
   409
  but do not model the fact that the number of processes in any practical 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   410
  system is limited. Similarly, IPCs and users are represented by natural 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   411
  numbers. The thirteen actions a process can perform are represented by
dcde836219bc add thy files
chunhan
parents:
diff changeset
   412
  the following datatype of \emph{events}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   413
  
dcde836219bc add thy files
chunhan
parents:
diff changeset
   414
  \begin{isabelle}\ \ \ \ \ %%%
dcde836219bc add thy files
chunhan
parents:
diff changeset
   415
  \mbox{
dcde836219bc add thy files
chunhan
parents:
diff changeset
   416
  \begin{tabular}{r@ {\hspace{1.5mm}}c@ {\hspace{1.5mm}}l@ {\hspace{3mm}}l@ 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   417
                     {\hspace{1.5mm}}l@ {\hspace{3mm}}l@ {\hspace{1.5mm}}l@ 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   418
                     {\hspace{3mm}}l@ {\hspace{1.5mm}}l}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   419
  event 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   420
  & @{text "::="} & @{term "CreateFile p f"} & @{text "|"} & @{term "ReadFile p f"} & @{text "|"} & @{term "Send p i"}   & @{text "|"} & @{term "Kill p p'"}  \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   421
  & @{text "|"} & @{term "WriteFile p f"}    & @{text "|"} & @{term "Execute p f"} & @{text "|"} & @{term "Recv p i"}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   422
  & @{text "|"} & @{term "DeleteFile p f"}   & @{text "|"} & @{term "Clone p p'"} & @{text "|"} & @{term "CreateIPC p i"}  \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   423
  & @{text "|"} & @{term "ChangeOwner p u"}  & @{text "|"} & @{term "ChangeRole p r"} & @{text "|"} & @{term "DeleteIPC p i"}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   424
  \end{tabular}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   425
  \end{isabelle}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   426
dcde836219bc add thy files
chunhan
parents:
diff changeset
   427
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   428
  with the idea that for example in @{term Clone} a process @{term p} is cloned
dcde836219bc add thy files
chunhan
parents:
diff changeset
   429
  and the new process has the ID @{term "p'"}; with @{term Kill} the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   430
  intention is that the process @{term p} kills another process with
dcde836219bc add thy files
chunhan
parents:
diff changeset
   431
  ID @{term p'}. We will later give the definition what the role
dcde836219bc add thy files
chunhan
parents:
diff changeset
   432
  @{term r} can stand for in the constructor @{term ChangeRole}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   433
  (namely \emph{normal roles} only). As is custom in Unix, there is no
dcde836219bc add thy files
chunhan
parents:
diff changeset
   434
  difference between a directory and a file. The files @{term f} in
dcde836219bc add thy files
chunhan
parents:
diff changeset
   435
  the definition above are simply lists of strings.  For example, the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   436
  file @{text "/usr/bin/make"} is represented by the list @{text
dcde836219bc add thy files
chunhan
parents:
diff changeset
   437
  "[make, bin, usr]"} and the @{text root}-directory is the @{text
dcde836219bc add thy files
chunhan
parents:
diff changeset
   438
  Nil}-list. Following the presentation in \cite{ottrc}, our model of
8
2dab4bbb6684 fixed typos
chunhan
parents: 3
diff changeset
   439
  IPCs is rather simple-minded: we only have events for creation and deletion of IPCs,
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
   440
  as well as sending and receiving messages.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   441
dcde836219bc add thy files
chunhan
parents:
diff changeset
   442
  Events essentially transform one state of the system into
dcde836219bc add thy files
chunhan
parents:
diff changeset
   443
  another. The system starts with an initial state determining which 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   444
  processes, files and IPCs are active at the start of the system. We assume the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   445
  users of the system are fixed in the initial state; we also assume
dcde836219bc add thy files
chunhan
parents:
diff changeset
   446
  that the policy does not change while the system is running. We have 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   447
  three sets, namely
dcde836219bc add thy files
chunhan
parents:
diff changeset
   448
  @{term init_processes},
dcde836219bc add thy files
chunhan
parents:
diff changeset
   449
  @{term init_files} and
dcde836219bc add thy files
chunhan
parents:
diff changeset
   450
  @{term init_ipcs}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   451
  specifying the processes, files and IPCs present in the initial state.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   452
  We will often use the abbreviation
dcde836219bc add thy files
chunhan
parents:
diff changeset
   453
dcde836219bc add thy files
chunhan
parents:
diff changeset
   454
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   455
  @{thm (lhs) Init_def} @{text "\<equiv>"} 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   456
  @{thm (rhs) Init_rhs(1)[where f=obj]} @{text "\<or>"}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   457
  @{thm (rhs) Init_rhs(2)[where p=obj]} @{text "\<or>"}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   458
  @{thm (rhs) Init_rhs(3)[where i=obj]}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   459
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   460
dcde836219bc add thy files
chunhan
parents:
diff changeset
   461
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   462
  There are some assumptions we make about the files present in the initial state: we always
dcde836219bc add thy files
chunhan
parents:
diff changeset
   463
  require that the @{text "root"}-directory @{term "[]"} is part of the initial state
dcde836219bc add thy files
chunhan
parents:
diff changeset
   464
  and for every file in the initial state (excluding @{term "[]"}) we require that its 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   465
  parent is also part of the 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   466
  initial state.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   467
  After the initial state, the next states are determined
dcde836219bc add thy files
chunhan
parents:
diff changeset
   468
  by a list of events, called the \emph{trace}.  We need to define
dcde836219bc add thy files
chunhan
parents:
diff changeset
   469
  functions that allow us to make some observations about traces. One 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   470
  such function is called @{term "current_procs"} and
dcde836219bc add thy files
chunhan
parents:
diff changeset
   471
  calculates the set of ``alive'' processes in a state:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   472
dcde836219bc add thy files
chunhan
parents:
diff changeset
   473
  %initial state:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   474
  %We make assumptions about the initial state, they're:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   475
  %1. there exists a set of processes, files, IPCs and users already in the initial state,
dcde836219bc add thy files
chunhan
parents:
diff changeset
   476
  %users are not changed in system's running, we regards users adding and deleting a
dcde836219bc add thy files
chunhan
parents:
diff changeset
   477
  %administration task, not the issue for our policy checker; 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   478
  %2. every object in the initial state have got already roles/types/owner ... information assigned;
dcde836219bc add thy files
chunhan
parents:
diff changeset
   479
  %3. all the policy information are already preloaded in the initial state, including:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   480
  %a compatible type table, @{term compatible};
dcde836219bc add thy files
chunhan
parents:
diff changeset
   481
  %a mapping function from a role to its compatible role set, @{term comproles};
dcde836219bc add thy files
chunhan
parents:
diff changeset
   482
  %every role's default values is pre-set, e.g. default process create type and 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   483
  %and default file/directory create type.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   484
dcde836219bc add thy files
chunhan
parents:
diff changeset
   485
  \begin{isabelle}\ \ \ \ \ %%%
dcde836219bc add thy files
chunhan
parents:
diff changeset
   486
  \mbox{\begin{tabular}{l@ {\hspace{2mm}}c@ {\hspace{2mm}}l}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   487
  @{thm (lhs) current_procs.simps(1)} & @{text "\<equiv>"} & @{thm (rhs) current_procs.simps(1)}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   488
  @{thm (lhs) current_procs.simps(2)} & @{text "\<equiv>"} & @{thm (rhs) current_procs.simps(2)}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   489
  @{thm (lhs) current_procs.simps(3)} & @{text "\<equiv>"} & @{thm (rhs) current_procs.simps(3)}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   490
  @{term "current_procs (DUMMY#s)"} & @{text "\<equiv>"} & @{term "current_procs s"}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   491
  \end{tabular}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   492
  \end{isabelle}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   493
    
dcde836219bc add thy files
chunhan
parents:
diff changeset
   494
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   495
  The first clause states that in the empty trace, that is initial
dcde836219bc add thy files
chunhan
parents:
diff changeset
   496
  state, the processes are given by @{text "init_processes"}. The 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   497
  events for cloning a process, respectively killing a process, update this
dcde836219bc add thy files
chunhan
parents:
diff changeset
   498
  set of processes appropriately. Otherwise the set of live
dcde836219bc add thy files
chunhan
parents:
diff changeset
   499
  processes is unchanged. We have similar functions for alive files and 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   500
  IPCs, called @{term "current_files"} and @{term "current_ipcs"}. 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   501
8
2dab4bbb6684 fixed typos
chunhan
parents: 3
diff changeset
   502
  We can use these functions in order to formally model which events are
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
   503
  \emph{admissible} by the operating system in each state. We show just three 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   504
  rules that give the gist of this definition. First the rule for changing 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   505
  an owner of a process:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   506
dcde836219bc add thy files
chunhan
parents:
diff changeset
   507
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   508
  @{thm[mode=Rule] osgrant6}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   509
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   510
dcde836219bc add thy files
chunhan
parents:
diff changeset
   511
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   512
  We require that the process @{text p} is alive in the state @{text s}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   513
  (first premise) and that the new owner is a user that existed in the initial state
dcde836219bc add thy files
chunhan
parents:
diff changeset
   514
  (second premise).
dcde836219bc add thy files
chunhan
parents:
diff changeset
   515
  Next the rule for creating a new file:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   516
dcde836219bc add thy files
chunhan
parents:
diff changeset
   517
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   518
  @{thm[mode=Rule] osgrant2}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   519
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   520
  
dcde836219bc add thy files
chunhan
parents:
diff changeset
   521
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   522
  It states that
dcde836219bc add thy files
chunhan
parents:
diff changeset
   523
  a file @{text f} can be created by a process @{text p} being alive in the state @{text s},
dcde836219bc add thy files
chunhan
parents:
diff changeset
   524
  the new file does not exist already in this state and there exists
dcde836219bc add thy files
chunhan
parents:
diff changeset
   525
  a parent file @{text "pf"} for the new file. The parent file is just
dcde836219bc add thy files
chunhan
parents:
diff changeset
   526
  the tail of the list representing @{text f}. % if it exists 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   527
  %(@{text "Some"}-case) or @{text None} if it does not. 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   528
  Finally, the rule for cloning a process:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   529
dcde836219bc add thy files
chunhan
parents:
diff changeset
   530
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   531
  @{thm[mode=Rule] osgrant10}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   532
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   533
dcde836219bc add thy files
chunhan
parents:
diff changeset
   534
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   535
  Clearly the operating system should only allow to clone a process @{text p} if the 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   536
  process is currently alive. The cloned process will get the process
11
31d3d2b3f6b0 paper update
chunhan
parents: 10
diff changeset
   537
  ID ``randomly'' generated by the operating system, but this process ID should
31d3d2b3f6b0 paper update
chunhan
parents: 10
diff changeset
   538
  not already exist. The admissibility rules for the other events impose similar conditions. 
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
   539
dcde836219bc add thy files
chunhan
parents:
diff changeset
   540
  However, the admissibility check by the operating system is only one
dcde836219bc add thy files
chunhan
parents:
diff changeset
   541
  ``side'' of the constraints the RC-Model imposes. We also need to
dcde836219bc add thy files
chunhan
parents:
diff changeset
   542
  model the constraints of the access policy. For this we introduce
dcde836219bc add thy files
chunhan
parents:
diff changeset
   543
  separate @{text granted}-rules involving the sets @{text
dcde836219bc add thy files
chunhan
parents:
diff changeset
   544
  permissions} and @{text "compatible r"}: the former contains triples
dcde836219bc add thy files
chunhan
parents:
diff changeset
   545
  describing access control rules; the latter specifies for each role @{text r} 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   546
  which roles are compatible with @{text r}. These sets are used in the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   547
  RC-Model when a process having a role @{text r} takes on a new role
dcde836219bc add thy files
chunhan
parents:
diff changeset
   548
  @{text r'}. For example, a login-process might belong to root;
dcde836219bc add thy files
chunhan
parents:
diff changeset
   549
  once the user logs in, however, the role of the process should change to
dcde836219bc add thy files
chunhan
parents:
diff changeset
   550
  the user's default role. The corresponding @{text "granted"}-rule is
dcde836219bc add thy files
chunhan
parents:
diff changeset
   551
  as follows
dcde836219bc add thy files
chunhan
parents:
diff changeset
   552
dcde836219bc add thy files
chunhan
parents:
diff changeset
   553
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   554
  @{thm[mode=Rule] rcgrant7}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   555
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   556
  
dcde836219bc add thy files
chunhan
parents:
diff changeset
   557
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   558
  where we check whether the process @{text p} has currently role @{text r} and
dcde836219bc add thy files
chunhan
parents:
diff changeset
   559
  whether the RC-policy states that @{text r'} is in the role compatibility
dcde836219bc add thy files
chunhan
parents:
diff changeset
   560
  set of @{text r}. 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   561
dcde836219bc add thy files
chunhan
parents:
diff changeset
   562
  The complication in the RC-Model arises from the
8
2dab4bbb6684 fixed typos
chunhan
parents: 3
diff changeset
   563
  way the current role of a process in a state @{text s} is
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
   564
  calculated---represented by the predicate @{term is_current_role} in our formalisation.  
dcde836219bc add thy files
chunhan
parents:
diff changeset
   565
  For defining this predicate we need to trace the role of a process from
dcde836219bc add thy files
chunhan
parents:
diff changeset
   566
  the initial state to the current state. In the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   567
  initial state all processes have the role given by the function
dcde836219bc add thy files
chunhan
parents:
diff changeset
   568
  @{term "init_current_role"}.  If a @{term Clone} event happens then
dcde836219bc add thy files
chunhan
parents:
diff changeset
   569
  the new process will inherit the role from the parent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   570
  process. Similarly, if a @{term ChangeRole} event happens, then 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   571
  as seen in the rule above we just change the role accordingly. More interesting 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   572
  is an @{term Execute} event in the RC-Model. For this event we have 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   573
  to check the role attached to the file to be executed. 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   574
  There are a number of cases: If the role of the file is a 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   575
  \emph{normal} role, then the process will just take on this role 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   576
  when executing the file (this is like the setuid mechanism in Unix). But 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   577
  there are also four \emph{special} roles in the RC-Model:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   578
  @{term "InheritProcessRole"}, @{term "InheritUserRole"}, 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   579
   @{term "InheritParentRole"} and @{term
dcde836219bc add thy files
chunhan
parents:
diff changeset
   580
  InheritUpMixed}. For example, if a file to be executed has
dcde836219bc add thy files
chunhan
parents:
diff changeset
   581
  @{term "InheritProcessRole"} attached to it, then the process 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   582
  that executes this file keeps its role regardless of the information 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   583
  attached to the file. In this way programs can be can quarantined;
dcde836219bc add thy files
chunhan
parents:
diff changeset
   584
  @{term "InheritUserRole"} can be used for login shells
dcde836219bc add thy files
chunhan
parents:
diff changeset
   585
  to make sure they run with the user's default role.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   586
  The purpose of the other special roles is to determine the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   587
  role of a process according to the directory in which the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   588
  files are stored.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   589
dcde836219bc add thy files
chunhan
parents:
diff changeset
   590
  Having the notion of current role in place, we can define the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   591
  granted rule for the @{term Execute}-event: Suppose a process @{term
dcde836219bc add thy files
chunhan
parents:
diff changeset
   592
  p} wants to execute a file @{text f}. The RC-Model first fetches the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   593
  role @{text r} of this process (in the current state @{text s}) and
dcde836219bc add thy files
chunhan
parents:
diff changeset
   594
  the type @{text t} of the file. It then checks if the tuple @{term
dcde836219bc add thy files
chunhan
parents:
diff changeset
   595
  "(r, t, EXECUTE)"} is part of the policy, that is in our
dcde836219bc add thy files
chunhan
parents:
diff changeset
   596
  formalisation being an element in the set @{term compatible}. The
dcde836219bc add thy files
chunhan
parents:
diff changeset
   597
  corresponding rule is as follows
dcde836219bc add thy files
chunhan
parents:
diff changeset
   598
dcde836219bc add thy files
chunhan
parents:
diff changeset
   599
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   600
  @{thm[mode=Rule] rcgrant4}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   601
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   602
dcde836219bc add thy files
chunhan
parents:
diff changeset
   603
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   604
  The next @{text granted}-rule concerns the @{term CreateFile} event.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   605
  If this event occurs, then we have two rules in our RC-Model
dcde836219bc add thy files
chunhan
parents:
diff changeset
   606
  depending on how the type of the created file is derived. If the type is inherited
dcde836219bc add thy files
chunhan
parents:
diff changeset
   607
  from the parent directory @{text pf}, then the @{term granted}-rule is as follows:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   608
dcde836219bc add thy files
chunhan
parents:
diff changeset
   609
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   610
  @{thm[mode=Rule] rcgrant1} 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   611
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   612
dcde836219bc add thy files
chunhan
parents:
diff changeset
   613
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   614
  We check whether @{term pf} is the parent file (directory) of @{text f} and check
8
2dab4bbb6684 fixed typos
chunhan
parents: 3
diff changeset
   615
  whether the type of @{term pf} is @{term t}. We also need to fetch 
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
   616
  the role @{text r} of the process that seeks to get permission for creating 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   617
  the file. If the default type of this role @{text r} states that the 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   618
  type of the newly created file will be inherited from the parent file
dcde836219bc add thy files
chunhan
parents:
diff changeset
   619
  type, then we only need to check that the policy states that @{text r}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   620
  has permission to write into the directory @{text pf}.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   621
dcde836219bc add thy files
chunhan
parents:
diff changeset
   622
  The situation is different if the default type of role @{text r} is
dcde836219bc add thy files
chunhan
parents:
diff changeset
   623
  some \emph{normal} type, like text-file or executable. In such cases we want
dcde836219bc add thy files
chunhan
parents:
diff changeset
   624
  that the process creates some predetermined type of files. Therefore in the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   625
  rule we have to check whether the role is allowed to create a file of that
dcde836219bc add thy files
chunhan
parents:
diff changeset
   626
  type, and also check whether the role is allowed to write any new
dcde836219bc add thy files
chunhan
parents:
diff changeset
   627
  file into the parent file (directory). The corresponding rule is
dcde836219bc add thy files
chunhan
parents:
diff changeset
   628
  as follows.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   629
dcde836219bc add thy files
chunhan
parents:
diff changeset
   630
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   631
  @{thm[mode=Rule] rcgrant1'}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   632
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   633
  
dcde836219bc add thy files
chunhan
parents:
diff changeset
   634
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   635
  Interestingly, the type-information in the RC-model is also used for
dcde836219bc add thy files
chunhan
parents:
diff changeset
   636
  processes, for example when they need to change their owner. For
dcde836219bc add thy files
chunhan
parents:
diff changeset
   637
  this we have the rule
dcde836219bc add thy files
chunhan
parents:
diff changeset
   638
dcde836219bc add thy files
chunhan
parents:
diff changeset
   639
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   640
  @{thm[mode=Rule] rcgrant_CHO}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   641
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   642
dcde836219bc add thy files
chunhan
parents:
diff changeset
   643
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   644
  whereby we have to obtain both the role and type of the process @{term p}, and then check
dcde836219bc add thy files
chunhan
parents:
diff changeset
   645
  whether the policy allows a @{term ChangeOwner}-event for that role and type.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   646
dcde836219bc add thy files
chunhan
parents:
diff changeset
   647
  Overall we have 13 rules for the admissibility check by the operating system and
dcde836219bc add thy files
chunhan
parents:
diff changeset
   648
  14 rules for the granted check by the RC-Model.  
dcde836219bc add thy files
chunhan
parents:
diff changeset
   649
  They are used to characterise when an event @{text e} is \emph{valid} to 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   650
  occur in a state @{text s}. This can be inductively defined as the set of valid
dcde836219bc add thy files
chunhan
parents:
diff changeset
   651
  states.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   652
dcde836219bc add thy files
chunhan
parents:
diff changeset
   653
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   654
  \begin{tabular}{@ {}c@ {}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   655
  \mbox{@{thm [mode=Axiom] valid.intros(1)}}\hspace{5mm}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   656
  \mbox{@{thm [mode=Rule] valid.intros(2)}} 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   657
  \end{tabular}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   658
  \end{center}  
dcde836219bc add thy files
chunhan
parents:
diff changeset
   659
dcde836219bc add thy files
chunhan
parents:
diff changeset
   660
  The novel notion we introduce in this paper is the @{text tainted} 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   661
  relation. It characterises how a system can become infected when 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   662
  a file in the system contains, for example, a virus. We assume
dcde836219bc add thy files
chunhan
parents:
diff changeset
   663
  that the initial state contains some tainted
dcde836219bc add thy files
chunhan
parents:
diff changeset
   664
  objects (we call them @{term "seeds"}). Therefore in the initial state @{term "[]"}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   665
  an object is tainted, if it is an element in @{text "seeds"}.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   666
dcde836219bc add thy files
chunhan
parents:
diff changeset
   667
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   668
  \mbox{@{thm [mode=Rule] tainted.intros(1)}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   669
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   670
dcde836219bc add thy files
chunhan
parents:
diff changeset
   671
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   672
  Let us first assume such a tainted object is a file @{text f}.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   673
  If a process reads or executes a tainted file, then this process becomes
dcde836219bc add thy files
chunhan
parents:
diff changeset
   674
  tainted (in the state where the corresponding event occurs).
dcde836219bc add thy files
chunhan
parents:
diff changeset
   675
dcde836219bc add thy files
chunhan
parents:
diff changeset
   676
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   677
  \mbox{@{thm [mode=Rule] tainted.intros(3)}}\hspace{3mm}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   678
  \mbox{@{thm [mode=Rule] tainted.intros(6)}} 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   679
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   680
dcde836219bc add thy files
chunhan
parents:
diff changeset
   681
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   682
  We have a similar rule for a tainted IPC, namely
dcde836219bc add thy files
chunhan
parents:
diff changeset
   683
dcde836219bc add thy files
chunhan
parents:
diff changeset
   684
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   685
  \mbox{@{thm [mode=Rule] tainted.intros(9)}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   686
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   687
dcde836219bc add thy files
chunhan
parents:
diff changeset
   688
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   689
  which means if we receive anything from a tainted IPC, then
dcde836219bc add thy files
chunhan
parents:
diff changeset
   690
  the process becomes tainted. A process is also tainted 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   691
  when it is a produced by a @{text Clone}-event.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   692
dcde836219bc add thy files
chunhan
parents:
diff changeset
   693
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   694
  \mbox{@{thm [mode=Rule] tainted.intros(2)}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   695
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   696
dcde836219bc add thy files
chunhan
parents:
diff changeset
   697
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   698
  However, the tainting relationship must also work in the 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   699
  ``other'' direction, meaning if a process is tainted, then
dcde836219bc add thy files
chunhan
parents:
diff changeset
   700
  every file that is written or created will be tainted. 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   701
  This is captured by the four rules:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   702
dcde836219bc add thy files
chunhan
parents:
diff changeset
   703
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   704
  \begin{tabular}{c}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   705
  \mbox{@{thm [mode=Rule] tainted.intros(4)}} \hspace{3mm}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   706
  \mbox{@{thm [mode=Rule] tainted.intros(7)}} \medskip\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   707
  \mbox{@{thm [mode=Rule] tainted.intros(5)}} \hspace{3mm}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   708
  \mbox{@{thm [mode=Rule] tainted.intros(8)}} 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   709
  \end{tabular}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   710
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   711
  
dcde836219bc add thy files
chunhan
parents:
diff changeset
   712
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   713
  Finally, we have three rules that state whenever an object is tainted
dcde836219bc add thy files
chunhan
parents:
diff changeset
   714
  in a state @{text s}, then it will be still tainted in the 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   715
  next state @{term "e#s"}, provided the object is still \emph{alive}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   716
  in that state. We have such a rule for each kind of objects, for
dcde836219bc add thy files
chunhan
parents:
diff changeset
   717
  example for files the rule is:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   718
dcde836219bc add thy files
chunhan
parents:
diff changeset
   719
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   720
  \mbox{@{thm [mode=Rule] tainted_10}} 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   721
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   722
dcde836219bc add thy files
chunhan
parents:
diff changeset
   723
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   724
  Similarly for alive processes and IPCs (then respectively with premises 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   725
  @{term "p \<in> current_procs (e#s)"} and @{term "i \<in> current_ipcs (e#s)"}). 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   726
  When an object present in the initial state can be tainted in 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   727
  \emph{some} state (system run), we say it is @{text "taintable"}:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   728
dcde836219bc add thy files
chunhan
parents:
diff changeset
   729
  \begin{isabelle}\ \ \ \ \ %%%
dcde836219bc add thy files
chunhan
parents:
diff changeset
   730
  \mbox{\begin{tabular}{lcl}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   731
  @{thm (lhs) taintable_def} & @{text "\<equiv>"} & @{term "init obj"} @{text "\<and>"} @{thm (rhs) taintable_def}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   732
  \end{tabular}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   733
  \end{isabelle}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   734
dcde836219bc add thy files
chunhan
parents:
diff changeset
   735
  Before we can describe our static check deciding when a file is taintable, we
dcde836219bc add thy files
chunhan
parents:
diff changeset
   736
  need to describe the notions @{term deleted} and @{term undeletable}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   737
  for objects. The former characterises whether there is an event that deletes  
dcde836219bc add thy files
chunhan
parents:
diff changeset
   738
  these objects (files, processes or IPCs). For this we have the following 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   739
  four rules:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   740
dcde836219bc add thy files
chunhan
parents:
diff changeset
   741
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   742
  \begin{tabular}{@ {}c@ {\hspace{10mm}}c@ {}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   743
  \begin{tabular}{c}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   744
  @{thm [mode=Axiom] dels(1)}\\[-2mm]
dcde836219bc add thy files
chunhan
parents:
diff changeset
   745
  @{thm [mode=Axiom] dels(2)}\\[-2mm]
dcde836219bc add thy files
chunhan
parents:
diff changeset
   746
  @{thm [mode=Axiom] dels(3)}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   747
  \end{tabular} &
dcde836219bc add thy files
chunhan
parents:
diff changeset
   748
  @{thm [mode=Rule] dels(4)}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   749
  \end{tabular}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   750
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   751
dcde836219bc add thy files
chunhan
parents:
diff changeset
   752
dcde836219bc add thy files
chunhan
parents:
diff changeset
   753
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   754
  Note that an object cannot be deleted in the initial state @{text
dcde836219bc add thy files
chunhan
parents:
diff changeset
   755
  "[]"}.  An object is then said to be @{text "undeletable"} provided
dcde836219bc add thy files
chunhan
parents:
diff changeset
   756
  it did exist in the initial state and there does not exists a valid
dcde836219bc add thy files
chunhan
parents:
diff changeset
   757
  state in which the object is deleted:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   758
  
dcde836219bc add thy files
chunhan
parents:
diff changeset
   759
  \begin{isabelle}\ \ \ \ \ %%%
dcde836219bc add thy files
chunhan
parents:
diff changeset
   760
  \mbox{\begin{tabular}{l@ {\hspace{2mm}}c@ {\hspace{2mm}}l@ {}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   761
  @{thm (lhs) undeletable_def} & @{text "\<equiv>"} & %%@{thm (rhs) undeletable_def}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   762
  @{term "init obj \<and> \<not>(\<exists> s. (valid s \<and> deleted obj s))"}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   763
  \end{tabular}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   764
  \end{isabelle}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   765
dcde836219bc add thy files
chunhan
parents:
diff changeset
   766
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   767
  The point of this definition is that our static taintable check will only be
dcde836219bc add thy files
chunhan
parents:
diff changeset
   768
  complete for undeletable objects. But these are
dcde836219bc add thy files
chunhan
parents:
diff changeset
   769
  the ones system administrators are typically interested in (for
dcde836219bc add thy files
chunhan
parents:
diff changeset
   770
  example system files).  It should be clear, however, that we cannot
dcde836219bc add thy files
chunhan
parents:
diff changeset
   771
  hope for a meaningful check by just trying out all possible
dcde836219bc add thy files
chunhan
parents:
diff changeset
   772
  valid states in our dynamic model. The reason is that there are
dcde836219bc add thy files
chunhan
parents:
diff changeset
   773
  potentially infinitely many of them and therefore the search space would be
8
2dab4bbb6684 fixed typos
chunhan
parents: 3
diff changeset
   774
  infinite.  For example starting from an
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
   775
  initial state containing a process @{text p} and a file @{text pf}, 
13
dd1499f296ea updated to new isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 11
diff changeset
   776
  we can create files @{text "f\<^sub>1"}, @{text "f\<^sub>2"}, @{text "..."} 
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
   777
  via @{text "CreateFile"}-events. This can be pictured roughly as follows:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   778
dcde836219bc add thy files
chunhan
parents:
diff changeset
   779
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   780
  \begin{tabular}[t]{c@ {\hspace{-8mm}}c@ {\hspace{-8mm}}c@ {\hspace{-8mm}}c@ {\hspace{-8mm}}cc}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   781
  \begin{tabular}[t]{c}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   782
  Initial state:\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   783
  @{term "{p, pf}"}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   784
  \end{tabular} &
dcde836219bc add thy files
chunhan
parents:
diff changeset
   785
  \begin{tabular}[t]{c}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   786
  \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   787
  @{text "\<Longrightarrow>"}\\[2mm]
13
dd1499f296ea updated to new isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 11
diff changeset
   788
  {\small@{term "CreateFile p (f\<^sub>1#pf)"}}
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
   789
  \end{tabular}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   790
  &
dcde836219bc add thy files
chunhan
parents:
diff changeset
   791
  \begin{tabular}[t]{c}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   792
  \\
13
dd1499f296ea updated to new isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 11
diff changeset
   793
  @{term "{p, pf, f\<^sub>1#pf}"}
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
   794
  \end{tabular} 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   795
  &
dcde836219bc add thy files
chunhan
parents:
diff changeset
   796
  \begin{tabular}[t]{c}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   797
  \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   798
  @{text "\<Longrightarrow>"}\\[2mm]
13
dd1499f296ea updated to new isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 11
diff changeset
   799
  {\small@{term "CreateFile p (f\<^sub>2#f\<^sub>1#pf)"}}
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
   800
  \end{tabular}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   801
  &
dcde836219bc add thy files
chunhan
parents:
diff changeset
   802
  \begin{tabular}[t]{c}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   803
  \\
13
dd1499f296ea updated to new isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 11
diff changeset
   804
  @{term "{p, pf, f\<^sub>1#pf, f\<^sub>2#f\<^sub>1#pf}"}
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
   805
  \end{tabular} &
dcde836219bc add thy files
chunhan
parents:
diff changeset
   806
  \begin{tabular}[t]{c}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   807
  \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   808
  @{text "..."}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   809
  \end{tabular}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   810
  \end{tabular}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   811
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   812
dcde836219bc add thy files
chunhan
parents:
diff changeset
   813
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   814
  Instead, the idea of our static check is to use
dcde836219bc add thy files
chunhan
parents:
diff changeset
   815
  the policies of the RC-model for generating an answer, since they
dcde836219bc add thy files
chunhan
parents:
diff changeset
   816
  provide always a finite ``description of the system''. As we 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   817
  will see in the next section, this needs some care, however.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   818
*}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   819
dcde836219bc add thy files
chunhan
parents:
diff changeset
   820
section {* Our Static Check *}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   821
dcde836219bc add thy files
chunhan
parents:
diff changeset
   822
text {*
dcde836219bc add thy files
chunhan
parents:
diff changeset
   823
  Assume there is a tainted file in the system and suppose we face the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   824
  problem of finding out whether this file can affect other files,
dcde836219bc add thy files
chunhan
parents:
diff changeset
   825
  IPCs or processes? One idea is to work on the level of policies only, and
dcde836219bc add thy files
chunhan
parents:
diff changeset
   826
  check which operations are permitted by the role and type of this
dcde836219bc add thy files
chunhan
parents:
diff changeset
   827
  file. Then one builds the ``transitive closure'' of this information
dcde836219bc add thy files
chunhan
parents:
diff changeset
   828
  and checks for example whether the role @{text root} has become
dcde836219bc add thy files
chunhan
parents:
diff changeset
   829
  affected, in which case the whole system is compromised.  This is indeed the solution investigated
dcde836219bc add thy files
chunhan
parents:
diff changeset
   830
  in~\cite{guttman2005verifying} in the context of information flow
dcde836219bc add thy files
chunhan
parents:
diff changeset
   831
  and SELinux.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   832
dcde836219bc add thy files
chunhan
parents:
diff changeset
   833
  Unfortunately, restricting the calculations to only use policies is
dcde836219bc add thy files
chunhan
parents:
diff changeset
   834
  too simplistic for obtaining a check that is sound and complete---it
dcde836219bc add thy files
chunhan
parents:
diff changeset
   835
  over-approximates the dynamic tainted relation defined in the previous
dcde836219bc add thy files
chunhan
parents:
diff changeset
   836
  section. To see the problem consider
dcde836219bc add thy files
chunhan
parents:
diff changeset
   837
  the case where the tainted file has, say, the type @{text bin}. If
dcde836219bc add thy files
chunhan
parents:
diff changeset
   838
  the RC-policy contains a role @{text r} that can both read and write
dcde836219bc add thy files
chunhan
parents:
diff changeset
   839
  @{text bin}-files, we would conclude that all @{text bin}-files can potentially 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   840
  be tainted. That
dcde836219bc add thy files
chunhan
parents:
diff changeset
   841
  is indeed the case, \emph{if} there is a process having this role @{text
dcde836219bc add thy files
chunhan
parents:
diff changeset
   842
  r} running in the system. But if there is \emph{not}, then the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   843
  tainted file cannot ``spread''.  A similar problem arises in case there
dcde836219bc add thy files
chunhan
parents:
diff changeset
   844
  are two processes having the same role @{text r},  and this role is
dcde836219bc add thy files
chunhan
parents:
diff changeset
   845
  restricted to read files only.  Now if one of the processes is tainted, then
dcde836219bc add thy files
chunhan
parents:
diff changeset
   846
  the simple check involving only policies would incorrectly infer
dcde836219bc add thy files
chunhan
parents:
diff changeset
   847
  that all processes involving that role are tainted. But since the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   848
  policy for @{text r} is restricted to be read-only, there is in fact
dcde836219bc add thy files
chunhan
parents:
diff changeset
   849
  no danger that both processes can become tainted.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   850
dcde836219bc add thy files
chunhan
parents:
diff changeset
   851
  The main idea of our sound and complete check is to find a ``middle'' ground between
dcde836219bc add thy files
chunhan
parents:
diff changeset
   852
  the potentially infinite dynamic model and the too coarse
dcde836219bc add thy files
chunhan
parents:
diff changeset
   853
  information contained in the RC-policies. Our solution is to
dcde836219bc add thy files
chunhan
parents:
diff changeset
   854
  define a ``static'' version of the tainted relation, called @{term
dcde836219bc add thy files
chunhan
parents:
diff changeset
   855
  "tainted_s"}, that records relatively precisely the information
dcde836219bc add thy files
chunhan
parents:
diff changeset
   856
  about the initial state of the system (the one in which an object
dcde836219bc add thy files
chunhan
parents:
diff changeset
   857
  might be a @{term seed} and therefore tainted). However,
dcde836219bc add thy files
chunhan
parents:
diff changeset
   858
  we are less precise about the objects created in every subsequent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   859
  state. The result is that we can avoid the potential infinity of
dcde836219bc add thy files
chunhan
parents:
diff changeset
   860
  the dynamic model. 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   861
  For the @{term tainted_s}-relation we will consider the following 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   862
  three kinds of \emph{items} recording the information we need about
dcde836219bc add thy files
chunhan
parents:
diff changeset
   863
  processes, files and IPCs, respectively:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   864
dcde836219bc add thy files
chunhan
parents:
diff changeset
   865
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   866
  \begin{tabular}{l@ {\hspace{5mm}}l}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   867
  & Recorded information:\smallskip\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   868
  Processes: & @{term "SProc (r, dr, t, u) po"}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   869
  Files: & @{term "SFile (t, a) fo"}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   870
  IPCs: & @{term "SIPC (t) io"}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   871
  \end{tabular}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   872
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   873
  
dcde836219bc add thy files
chunhan
parents:
diff changeset
   874
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   875
  For a process we record its role @{text r}, its default role @{text dr} (used to determine
dcde836219bc add thy files
chunhan
parents:
diff changeset
   876
  the role when executing a file or changing the owner of a process), its type @{text t} 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   877
  and its owner @{text u}. For a file we record
dcde836219bc add thy files
chunhan
parents:
diff changeset
   878
  just the type @{text t} and its @{term "source_dir"} @{text a} (we define this
dcde836219bc add thy files
chunhan
parents:
diff changeset
   879
  notion shortly). For IPCs we only record its type @{text t}. Note the superscripts
dcde836219bc add thy files
chunhan
parents:
diff changeset
   880
  @{text po}, @{text fo} and @{text io} in each item. They are optional arguments and depend on
dcde836219bc add thy files
chunhan
parents:
diff changeset
   881
  whether the corresponding object is present in the initial state or not.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   882
  If it \emph{is}, then for processes and IPCs we will record @{term "Some(id)"},
dcde836219bc add thy files
chunhan
parents:
diff changeset
   883
  where @{text id} is the natural number that uniquely identifies a process or IPC;
dcde836219bc add thy files
chunhan
parents:
diff changeset
   884
  for files we just record their path @{term "Some(f)"}. If the object is
dcde836219bc add thy files
chunhan
parents:
diff changeset
   885
  \emph{not} present in the initial state, that is newly created, then we just have
dcde836219bc add thy files
chunhan
parents:
diff changeset
   886
  @{term None} as superscript. 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   887
  Let us illustrate the different superscripts with the following example
dcde836219bc add thy files
chunhan
parents:
diff changeset
   888
  where the initial state contains a process @{term p} and a file (directory)
dcde836219bc add thy files
chunhan
parents:
diff changeset
   889
  @{term pf}. Then this
dcde836219bc add thy files
chunhan
parents:
diff changeset
   890
  process creates a file via a @{term "CreateFile"}-event and after that reads
dcde836219bc add thy files
chunhan
parents:
diff changeset
   891
  the created file via a @{term Read}-event:
dcde836219bc add thy files
chunhan
parents:
diff changeset
   892
dcde836219bc add thy files
chunhan
parents:
diff changeset
   893
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   894
  \begin{tabular}[t]{ccccc}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   895
  \begin{tabular}[t]{c}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   896
  Initial state:\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   897
  @{term "{p, pf}"}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   898
  \end{tabular} &
dcde836219bc add thy files
chunhan
parents:
diff changeset
   899
  \begin{tabular}[t]{c}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   900
  \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   901
  @{text "\<Longrightarrow>"}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   902
  {\small@{term "CreateFile p (f#pf)"}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   903
  \end{tabular}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   904
  &
dcde836219bc add thy files
chunhan
parents:
diff changeset
   905
  \begin{tabular}[t]{c}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   906
  \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   907
  @{term "{p, pf, f#pf}"}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   908
  \end{tabular} 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   909
  &
dcde836219bc add thy files
chunhan
parents:
diff changeset
   910
  \begin{tabular}[t]{c}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   911
  \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   912
  @{text "\<Longrightarrow>"}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   913
  {\small@{term "ReadFile p (f#pf)"}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   914
  \end{tabular}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   915
  &
dcde836219bc add thy files
chunhan
parents:
diff changeset
   916
  \begin{tabular}[t]{c}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   917
  \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   918
  @{term "{p, pf, f#pf}"}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   919
  \end{tabular} 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   920
  \end{tabular}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   921
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   922
dcde836219bc add thy files
chunhan
parents:
diff changeset
   923
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   924
  For the two objects in the initial state our static check records
dcde836219bc add thy files
chunhan
parents:
diff changeset
   925
  the information @{term "SProc (r, dr, t, u) (Some(p))"} and @{term
dcde836219bc add thy files
chunhan
parents:
diff changeset
   926
  "SFile (t', a) (Some(pf))"} (assuming @{text "r"}, @{text t} and so
dcde836219bc add thy files
chunhan
parents:
diff changeset
   927
  on are the corresponding roles, types etc).  In both cases we have
dcde836219bc add thy files
chunhan
parents:
diff changeset
   928
  the superscript @{text "Some(...)"}  since they are objects present
dcde836219bc add thy files
chunhan
parents:
diff changeset
   929
  in the initial state. For the file @{term "f#pf"} created by the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   930
  @{term "CreateFile"}-event, we record @{term "SFile (t', a')
dcde836219bc add thy files
chunhan
parents:
diff changeset
   931
  (None)"}, since it is a newly created file.  The @{text
dcde836219bc add thy files
chunhan
parents:
diff changeset
   932
  "ReadFile"}-event does not change the set of objects, therefore no
dcde836219bc add thy files
chunhan
parents:
diff changeset
   933
  new information needs to be recorded. The problem we are avoiding
dcde836219bc add thy files
chunhan
parents:
diff changeset
   934
  with this setup of recording the precise information for the initial
dcde836219bc add thy files
chunhan
parents:
diff changeset
   935
  state is where two processes have the same role and type
dcde836219bc add thy files
chunhan
parents:
diff changeset
   936
  information, but only one is tainted in the initial state, but the
8
2dab4bbb6684 fixed typos
chunhan
parents: 3
diff changeset
   937
  other is not. The recorded unique process ID allows us to
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
   938
  distinguish between both processes.  For all newly created objects,
dcde836219bc add thy files
chunhan
parents:
diff changeset
   939
  on the other hand, we do not care.  This is crucial, because
dcde836219bc add thy files
chunhan
parents:
diff changeset
   940
  otherwise exploring all possible ``reachable'' objects can lead to
dcde836219bc add thy files
chunhan
parents:
diff changeset
   941
  the potential infinity like in the dynamic model.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   942
dcde836219bc add thy files
chunhan
parents:
diff changeset
   943
  An @{term source_dir} for a file is the ``nearest'' directory that
dcde836219bc add thy files
chunhan
parents:
diff changeset
   944
  is present in the initial state and has not been deleted in a state
dcde836219bc add thy files
chunhan
parents:
diff changeset
   945
  @{text s}. Its definition is the recursive function
dcde836219bc add thy files
chunhan
parents:
diff changeset
   946
  
dcde836219bc add thy files
chunhan
parents:
diff changeset
   947
  \begin{isabelle}\ \ \ \ \ %%%
dcde836219bc add thy files
chunhan
parents:
diff changeset
   948
  \mbox{\begin{tabular}{lcl}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   949
  @{thm (lhs) source_dir.simps(1)} & @{text "\<equiv>"} \;\; &
dcde836219bc add thy files
chunhan
parents:
diff changeset
   950
  @{text "if"} @{text "\<not> deleted [] s"} @{text "then"} @{term "Some []"} @{text "else"} @{term "None"}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   951
  @{thm (lhs) source_dir.simps(2)} & @{text "\<equiv>"} & 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   952
  @{text "if"} @{term "(f#pf) \<in> init_files \<and> \<not>(deleted (File (f#pf)) s)"}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   953
  & & @{text "then"} @{term "Some (f#pf)"} @{text "else"} @{term "source_dir s pf"}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
   954
  \end{tabular}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   955
  \end{isabelle}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   956
  
dcde836219bc add thy files
chunhan
parents:
diff changeset
   957
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   958
  generating an optional value.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   959
  The first clause states that the anchor of the @{text
dcde836219bc add thy files
chunhan
parents:
diff changeset
   960
  root}-directory is always its own anchor unless it has been
dcde836219bc add thy files
chunhan
parents:
diff changeset
   961
  deleted. If a file is present in the initial state and not deleted
dcde836219bc add thy files
chunhan
parents:
diff changeset
   962
  in @{text s}, then it is also its own anchor, otherwise the anchor
dcde836219bc add thy files
chunhan
parents:
diff changeset
   963
  will be the anchor of the parent directory.  For example if we have
dcde836219bc add thy files
chunhan
parents:
diff changeset
   964
  a directory @{text pf} in the initial state, then its anchor is @{text "Some pf"}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   965
  (assuming it is not deleted). If we create a new file in this directory,
dcde836219bc add thy files
chunhan
parents:
diff changeset
   966
  say @{term "f#pf"}, then its anchor will also be @{text "Some pf"}.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   967
  The purpose of @{term source_dir} is to determine the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   968
  role information when a file is executed, because the role of the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   969
  corresponding process, according to the RC-model, is determined by the role information of the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   970
  anchor of the file to be executed.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   971
dcde836219bc add thy files
chunhan
parents:
diff changeset
   972
  There is one last problem we have to solve before we can give the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   973
  rules of our @{term "tainted_s"}-check. Suppose an RC-policy 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   974
  includes the rule @{text "(r, foo, Write) \<in> permissions"}, that is
dcde836219bc add thy files
chunhan
parents:
diff changeset
   975
  a process of role @{text "r"} is allowed to write files of type @{text "foo"}.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   976
  If there is a tainted process with this role, we would conclude that
dcde836219bc add thy files
chunhan
parents:
diff changeset
   977
  also every file of that type can potentially become tainted. However, that
dcde836219bc add thy files
chunhan
parents:
diff changeset
   978
  is not the case if the initial state does not contain any file
dcde836219bc add thy files
chunhan
parents:
diff changeset
   979
  with type @{text foo} and the RC-policy does not allow the
dcde836219bc add thy files
chunhan
parents:
diff changeset
   980
  creation of such files, that is does not contain an access rule
dcde836219bc add thy files
chunhan
parents:
diff changeset
   981
  @{text "(r, foo, Create) \<in> permissions"}. In a sense the original
dcde836219bc add thy files
chunhan
parents:
diff changeset
   982
  @{text "(r, foo, Write)"} is ``useless'' and should not contribute
dcde836219bc add thy files
chunhan
parents:
diff changeset
   983
  to the relation characterising the objects that are tainted.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   984
  To exclude such ``useless'' access rules, we define
dcde836219bc add thy files
chunhan
parents:
diff changeset
   985
  a relation @{term "all_sobjs"} restricting our search space 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   986
  to only configurations that correspond to states in our dynamic model.
dcde836219bc add thy files
chunhan
parents:
diff changeset
   987
  We first have a rule for reachable items of the form  @{text "F(t, f)\<^bsup>Some f\<^esup>"}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   988
  where the file @{text f} with type @{text t} is present in 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   989
  the initial state. 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   990
dcde836219bc add thy files
chunhan
parents:
diff changeset
   991
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   992
  @{thm [mode=Rule] af_init'}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   993
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
   994
dcde836219bc add thy files
chunhan
parents:
diff changeset
   995
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
   996
  We have similar reachability rules for processes and IPCs that are part of the 
dcde836219bc add thy files
chunhan
parents:
diff changeset
   997
  initial state. Next is the reachability rule in case a file is created
dcde836219bc add thy files
chunhan
parents:
diff changeset
   998
dcde836219bc add thy files
chunhan
parents:
diff changeset
   999
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1000
  @{thm [mode=Rule] af_cfd[where sd=a and sf="fo" and sp="po" and fr="dr"]}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1001
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1002
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1003
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1004
  where we require that we have a reachable parent directory, recorded
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1005
  as @{text "F(t, a)\<^bsup>fo\<^esup>"}, and also a
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1006
  process that can create the file, recorded as @{text "P(r, dr, pt,
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1007
  u)\<^bsup>po\<^esup>"}. As can be seen, we also require that we have both @{text "(r, t,
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1008
  Write)"} and \mbox{@{text "(r, t', Create)"}} in the @{text permissions} set 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1009
  for this rule to apply. If we did \emph{not} impose this requirement
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1010
  about the RC-policy, then there would be no way to create a file
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1011
  with @{term "NormalFileType t'"} according to our ``dynamic'' model. 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1012
  However in case we want to create a 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1013
  file of type @{term InheritPatentType}, then we only need the access-rule
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1014
  @{text "(r, t, Write)"}: 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1015
  
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1016
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1017
  @{thm [mode=Rule] af_cfd'[where sd=a and sf="fo" and sp="po" and fr="dr"]}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1018
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1019
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1020
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1021
  We also have reachability rules for processes executing files, and
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1022
  for changing their roles and owners, for example
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1023
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1024
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1025
  @{thm [mode=Rule] ap_crole[where sp="po" and fr="dr"]}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1026
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1027
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1028
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1029
  which states that when we have a process with role @{text r}, and the role
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1030
  @{text "r'"} is in the corresponding role-compatibility set, then also
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1031
  a process with role @{text "r'"} is reachable.
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1032
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1033
  The crucial difference between between the ``dynamic'' notion of validity 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1034
  and the ``static'' notion of @{term "all_sobjs"}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1035
  is that there can be infinitely many valid states, but assuming the initial
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1036
  state contains only finitely many objects, then also @{term "all_sobjs"} will 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1037
  be finite. To see the difference, consider the infinite ``chain'' of events 
13
dd1499f296ea updated to new isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 11
diff changeset
  1038
  just cloning a process @{text "p\<^sub>0"}:
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1039
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1040
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1041
  \begin{tabular}[t]{c@ {\hspace{-2mm}}c@ {\hspace{-2mm}}c@ {\hspace{-2mm}}c@ {\hspace{-2mm}}cc}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1042
  \begin{tabular}[t]{c}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1043
  Initial state:\\
13
dd1499f296ea updated to new isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 11
diff changeset
  1044
  @{term "{p\<^sub>0}"}
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1045
  \end{tabular} &
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1046
  \begin{tabular}[t]{c}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1047
  \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1048
  @{text "\<Longrightarrow>"}\\[2mm]
13
dd1499f296ea updated to new isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 11
diff changeset
  1049
  {\small@{term "Clone p\<^sub>0 p\<^sub>1"}}
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1050
  \end{tabular}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1051
  &
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1052
  \begin{tabular}[t]{c}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1053
  \\
13
dd1499f296ea updated to new isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 11
diff changeset
  1054
  @{term "{p\<^sub>0, p\<^sub>1}"}
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1055
  \end{tabular} 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1056
  &
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1057
  \begin{tabular}[t]{c}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1058
  \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1059
  @{text "\<Longrightarrow>"}\\[2mm]
13
dd1499f296ea updated to new isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 11
diff changeset
  1060
  {\small@{term "Clone p\<^sub>0 p\<^sub>2"}}
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1061
  \end{tabular}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1062
  &
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1063
  \begin{tabular}[t]{c}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1064
  \\
13
dd1499f296ea updated to new isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 11
diff changeset
  1065
  @{term "{p\<^sub>0, p\<^sub>1, p\<^sub>2}"}
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1066
  \end{tabular} &
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1067
  \begin{tabular}[t]{c}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1068
  \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1069
  @{text "..."}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1070
  \end{tabular}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1071
  \end{tabular}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1072
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1073
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1074
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1075
  The corresponding reachable objects are
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1076
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1077
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1078
  \begin{tabular}[t]{cccc}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1079
  \begin{tabular}[t]{c}
13
dd1499f296ea updated to new isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 11
diff changeset
  1080
  @{text "{P(r, dr, t, u)\<^bsup>Some (p\<^sub>0)\<^esup>}"}
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1081
  \end{tabular} &
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1082
  \begin{tabular}[t]{c}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1083
  @{text "\<Longrightarrow>"}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1084
  \end{tabular}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1085
  &
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1086
  \begin{tabular}[t]{c}
13
dd1499f296ea updated to new isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 11
diff changeset
  1087
  @{text "{P(r, dr, t, u)\<^bsup>Some (p\<^sub>0)\<^esup>, P(r, dr, t, u)\<^bsup>None\<^esup>}"}
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1088
  \end{tabular} 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1089
  \end{tabular}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1090
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1091
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1092
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1093
  where no further progress can be made because the information
13
dd1499f296ea updated to new isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 11
diff changeset
  1094
  recorded about @{text "p\<^sub>2"}, @{text "p\<^sub>3"} and so on is just the same
dd1499f296ea updated to new isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 11
diff changeset
  1095
  as for @{text "p\<^sub>1"}, namely @{text "P(r, dr, t, u)\<^bsup>None\<^esup>"}.  Indeed we
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1096
  can prove the lemma:
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1097
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1098
  \begin{lemma}\label{finite}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1099
  If @{text "finite init"}, then @{term "finite all_sobjs"}.
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1100
  \end{lemma}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1101
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1102
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1103
  This fact of @{term all_sobjs} being finite enables us to design a
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1104
  decidable tainted-check. For this we introduce inductive rules defining the
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1105
  set @{term "tainted_s"}. Like in the ``dynamic'' version of tainted,
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1106
  if an object is element of @{text seeds}, then it is @{term "tainted_s"}.
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1107
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1108
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1109
  @{thm [mode=Rule] ts_init}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1110
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1111
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1112
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1113
  The function @{text "\<lbrakk>_\<rbrakk>"} extracts the static information from an object.
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1114
  For example for a process it extracts the role, default role, type and
8
2dab4bbb6684 fixed typos
chunhan
parents: 3
diff changeset
  1115
  user; for a file the type and the anchor. If a process is tainted and creates
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1116
  a file with a normal type @{text "t'"} then also the created file
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1117
  is tainted. The corresponding rule is
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1118
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1119
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1120
  @{thm [mode=Rule] ts_cfd[where sd=a and sf="fo" and sp="po" and fr="dr"]}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1121
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1122
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1123
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1124
  If a tainted process  creates a file that inherits the type of the directory,
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1125
  then the file will also be tainted:
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1126
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1127
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1128
  @{thm [mode=Rule] ts_cfd'[where sd=a and sf="fo" and sp="po" and fr="dr"]}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1129
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1130
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1131
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1132
  If a tainted process changes its role, then also with this changed role
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1133
  it will be tainted:
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1134
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1135
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1136
  @{thm [mode=Rule] ts_crole[where pt=t and sp="po" and fr="dr"]}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1137
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1138
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1139
  \noindent 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1140
  Similarly when a process changes its owner. If a file is tainted, and
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1141
  a process has read-permission to that type of files, then the 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1142
  process becomes tainted. The corresponding rule is
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1143
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1144
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1145
  @{thm [mode=Rule] ts_read[where sd=a and sf="fo" and sp="po" and fr="dr"]}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1146
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1147
  
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1148
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1149
  If a process is tainted and it has write-permission for files of type @{text t}, 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1150
  then these files will be tainted:
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1151
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1152
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1153
  @{thm [mode=Rule] ts_write[where sd=a and sf="fo" and sp="po" and fr="dr"]}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1154
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1155
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1156
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1157
  We omit the remaining rules for executing a file, cloning a process and 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1158
  rules involving IPCs, which are similar. A simple consequence of our definitions 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1159
  is that every tainted object is also reachable:
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1160
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1161
  \begin{lemma}
13
dd1499f296ea updated to new isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 11
diff changeset
  1162
  @{text "tainted\<^sup>s \<subseteq> reachable\<^sup>s"}
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1163
  \end{lemma}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1164
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1165
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1166
  which in turn means that the set of @{term "tainted_s"} items is finite by Lemma~\ref{finite}.
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1167
  
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1168
  Returning to our original question about whether tainted objects can spread
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1169
  in the system. To answer this question, we take these tainted objects as
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1170
  seeds and calculate the set of items that are @{term "tainted_s"}. We proved this
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1171
  set is finite and can be enumerated using the rules for @{term tainted_s}.
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1172
  However, this set is about items, not about whether objects are tainted or not. 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1173
  Assuming an item in @{term tainted_s} arises from an object present in the initial
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1174
  state, we have recorded enough information to translate items back into objects 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1175
  via the function @{text "|_|"}:
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1176
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1177
  \begin{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1178
  \begin{tabular}{lcl}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1179
  @{text "|P(r, dr, t, u)\<^bsup>po\<^esup>|"} & @{text "\<equiv>"} & @{text po}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1180
  @{text "|F(t, a)\<^bsup>fo\<^esup>|"} & @{text "\<equiv>"} & @{text fo}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1181
  @{text "|I(t\<^bsup>\<^esup>)\<^bsup>io\<^esup>|"} & @{text "\<equiv>"} & @{text io}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1182
  \end{tabular}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1183
  \end{center}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1184
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1185
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1186
  Using this function, we can define when an object is @{term taintable_s} in terms of
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1187
  an item being @{term tainted_s}, namely
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1188
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1189
  \begin{isabelle}\ \ \ \ \ %%%
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1190
  \mbox{\begin{tabular}{lcl}
13
dd1499f296ea updated to new isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 11
diff changeset
  1191
  @{thm (lhs) taintable_s_def} & @{text "\<equiv>"} & @{text "\<exists>item. item \<in> tainted\<^sup>s \<and> |item| = Some obj"}
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1192
  \end{tabular}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1193
  \end{isabelle}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1194
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1195
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1196
  Note that @{term taintable_s} is only about objects that are present in
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1197
  the initial state, because for all other items @{text "|_|"} returns @{text None}. 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1198
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1199
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1200
  With these definitions in place, we can state our theorem about the soundness of our 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1201
  static @{term taintable_s}-check for objects.
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1202
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1203
  \begin{theorem}[Soundness]
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1204
  @{thm [mode=IfThen] static_sound}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1205
  \end{theorem}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1206
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1207
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1208
  The proof of this theorem generates for every object that is ``flagged'' as 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1209
  @{term taintable_s} by our check, a sequence of events which shows how the
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1210
  object can become tainted in the dynamic model.  We can also state a completeness
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1211
  theorem for our @{term taintable_s}-check.
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1212
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1213
  \begin{theorem}[Completeness]
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1214
  @{thm [mode=IfThen] static_complete}  
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1215
  \end{theorem}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1216
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1217
  \noindent
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1218
  This completeness theorem however needs to be restricted to
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1219
  undeletebale objects. The reason is that a tainted process can be
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1220
  killed by another process, and after that can be ``recreated'' by a
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1221
  cloning event from an untainted process---remember we have no control
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1222
  over which process ID a process will be assigned with.  Clearly, in
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1223
  this case the cloned process should be considered untainted, and
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1224
  indeed our dynamic tainted relation is defined in this way. The
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1225
  problem is that a static test cannot know about a process being
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1226
  killed and then recreated. Therefore the static test will not be
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1227
  able to ``detect'' the difference.  Therefore we solve this problem
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1228
  by considering only objects that are present in the initial state
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1229
  and cannot be deleted. By the latter we mean that the RC-policy
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1230
  stipulates an object cannot be deleted (for example it has been created
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1231
  by @{term root} in single-user mode, but in the everyday running
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1232
  of the system the RC-policy forbids to delete an object belonging to
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1233
  @{term root}). Like @{term "taintable_s"}, we also have a static check 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1234
  for when a file is undeletable according to an RC-policy.
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1235
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1236
  This restriction to undeletable objects might be seen as a great
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1237
  weakness of our result, but in practice this seems to cover the
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1238
  interesting scenarios encountered by system administrators. They
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1239
  want to know whether a virus-infected file introduced by a user can
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1240
  affect the core system files. Our test allows the system
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1241
  administrator to find this out provided the RC-policy makes the core
8
2dab4bbb6684 fixed typos
chunhan
parents: 3
diff changeset
  1242
  system files undeletable. We assume that this proviso is already part 
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1243
  of best practice rule for running a system.
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1244
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1245
  We envisage our test to be useful in two kind of situations: First, if
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1246
  there was a break-in into a system, then, clearly, the system
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1247
  administrator can find out whether the existing access policy was
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1248
  strong enough to contain the break-in, or whether core system files
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1249
  could have been affected.  In the first case, the system
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1250
  administrator can just plug the hole and forget about the break-in;
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1251
  in the other case the system administrator is wise to completely
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1252
  reinstall the system.
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1253
  Second, the system administrator can proactively check whether an
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1254
  RC-policy is strong enough to withstand serious break-ins. To do so
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1255
  one has to identify the set of ``core'' system files that the policy
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1256
  should protect and mark every possible entry point for an attacker
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1257
  as tainted (they are the seeds of the @{term "tainted_s"} relation).  
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1258
  Then the test will reveal
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1259
  whether the policy is strong enough or needs to be redesigned. For
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1260
  this redesign, the sequence of events our check generates should be
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1261
  informative.
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1262
*}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1263
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1264
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1265
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1266
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1267
section {*Conclusion and Related Works*}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1268
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1269
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1270
text {*
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1271
  We have presented the first completely formalised dynamic model of
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1272
  the Role-Compa\-tibility Model. This is a framework, introduced by Ott
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1273
  \cite{ottrc}, in which role-based access control policies
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1274
  can be formulated and is used in practice, for example, for securing Apache 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1275
  servers. Previously, the RC-Model was presented as a
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1276
  collection of rules partly given in ``English'', partly given as formulas.
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1277
  During the formalisation we uncovered an inconsistency in the
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1278
  semantics of the special role @{term "InheritParentRole"} in
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1279
  the existing works about the RC-Model \cite{ottrc,ottweb}.  By proving
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1280
  the soundness and completeness of our static @{term
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1281
  "taintable_s"}-check, we have formally related the dynamic behaviour
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1282
  of the operating system implementing access control and the static 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1283
  behaviour of the access policies of the RC-Model. The
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1284
  crucial idea in our static check is to record precisely the
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1285
  information available about the initial state (in which some resources might be
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1286
  tainted), but be less precise
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1287
  about the subsequent states. The former fact essentially gives us
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1288
  the soundness of our check, while the latter results in a finite
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1289
  search space. 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1290
  
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1291
  The two most closely related works are by Archer et al and by Guttman et al
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1292
  \cite{Archer03,guttman2005verifying}. The first describes a
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1293
  formalisation of the dynamic behaviour of SELinux carried out in the
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1294
  theorem prover PVS. However, they cannot use their formalisation in
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1295
  order to prove any ``deep'' properties about access control rules
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1296
  \cite[Page 167]{Archer03}.  The second analyses access control
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1297
  policies in the context of information flow. Since this work 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1298
  is completely on the level of policies, it does
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1299
  not lead to a sound and complete check for files being taintable (a dynamic notion
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1300
  defined in terms of operations performed by the operating system).
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1301
  While our results concern the RC-Model, we expect that they 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1302
  equally apply to the access control model of SELinux. In fact,
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1303
  we expect that the formalisation is simpler for SELinux, since 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1304
  its rules governing roles are much simpler than in the RC-Model.
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1305
  The definition of our admissibility rules can be copied verbatim for SELinux;
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1306
  we would need to modify our granted rules and slightly adapt our
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1307
  static check. We leave this as future work.
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1308
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1309
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1310
  Our formalisation is carried out in the Isabelle/HOL theorem prover.
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1311
  It uses Paulson's inductive method for
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1312
  reasoning about sequences of events \cite{Paulson98}.
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1313
  We have approximately 1000 lines of code for definitions and 6000 lines of
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1314
  code for proofs. Our formalisation is available from the
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1315
  Mercurial repository at \url{http://www.dcs.kcl.ac.uk/staff/urbanc/cgi-bin/repos.cgi/rc/}.\\[-12mm]
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1316
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1317
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1318
%In a word, what the manager need is that given the
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1319
%initial state of the system, a policy checker that make sure the under the policy
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1320
%he made, this important file cannot: 1. be deleted; 2. be tainted. 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1321
%Formally speaking, this policy-checker @{text "PC"} (a function that given the 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1322
%initial state of system, a policy and an object, it tells whether this object 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1323
%will be fully protected or not) should satisfy this criteria: 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1324
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1325
%  @{text "(PC init policy obj) \<and> (exists init obj) \<longrightarrow> \<not> taintable obj"}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1326
%If the @{text obj} exists in the initial-state, and @{text "PC"} justify the safety
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1327
%of this object under @{text "policy"}, this object should not be @{text taintable}.
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1328
%We call this criteria the \emph{completeness} of @{text "PC"}. 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1329
%And there is the \emph{soundness} criteria of @{text "PC"} too, otherwise a "NO-to-ALL"
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1330
%answer always satisfy the \emph{completeness}. \emph{soundness} formally is:
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1331
%  @{text "PC init policy obj \<longrightarrow> taintable obj"}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1332
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1333
%This policy-checker should satisfy other properties:
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1334
% 1. fully statical, that means this policy-checker should not rely on the system 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1335
%running information, like new created files/process, and most importantly the 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1336
%trace of system running. 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1337
% 2. decidable, that means this policy-checker should always terminate.
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1338
3
chunhan
parents: 1
diff changeset
  1339
*}
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1340
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1341
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1342
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1343
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1344
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1345
(*<*)
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1346
end
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1347
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1348
end
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1349
(*>*)
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1350
8
2dab4bbb6684 fixed typos
chunhan
parents: 3
diff changeset
  1351
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1352
(*
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1353
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1354
  Central to RC-Model is the roles and types. We start with do formalisation on
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1355
  types first.
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1356
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1357
  \begin{isabelle}\ \ \ \ \ %%%
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1358
  \mbox{
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1359
  \begin{tabular}{r@ {\hspace{1mm}}l@ {\hspace{2mm}}l}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1360
  @{text t_client} & @{text "="} & @{text "Christian"} \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1361
                   & @{text "|"} & @{text "Chunhan"}   \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1362
                   & @{text "|"} & @{text " ... "}     \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1363
  \end{tabular}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1364
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1365
  \mbox{
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1366
  \begin{tabular}{r@ {\hspace{1mm}}l@ {\hspace{2mm}}l@ {\hspace{2mm}}l}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1367
  @{text t_normal_file_type}  & @{text "="} & @{text "WebServerLog_file"} &             \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1368
                              & @{text "|"} & @{text "WebData_file"} & @{text t_client} \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1369
                              & @{text "|"} & @{text "CGI_file"}     & @{text t_client} \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1370
                              & @{text "|"} & @{text "Private_file"} & @{text t_client} 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1371
  \end{tabular}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1372
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1373
  \mbox{
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1374
  \begin{tabular} {r@ {\hspace{1mm}}l@ {\hspace{5mm}}l}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1375
  @{text t_rc_file_type} 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1376
     & @{text "="} & @{term "InheritParent_file_type"}   \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1377
     & @{text "|"} & @{term "NormalFile_type t_normal_file_type"}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1378
  \end{tabular}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1379
  \end{isabelle}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1380
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1381
  @{term "type_of_file"} function calculates the current type for the files:
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1382
  \begin{isabelle}\ \ \ \ \ %%%
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1383
  \mbox{\begin{tabular}{lcl}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1384
  @{thm (lhs) type_of_file.simps(1)} & @{text "\<equiv>"} & @{thm (rhs) type_of_file.simps(1)}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1385
  @{thm (lhs) type_of_file.simps(2)} & @{text "\<equiv>"} & @{thm (rhs) type_of_file.simps(2)}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1386
  @{term "type_of_file (DUMMY#s)"} & @{text "\<equiv>"} & @{term "type_of_file s"}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1387
  \end{tabular}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1388
  \end{isabelle}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1389
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1390
  Note that this @{term "type_of_file"} is not the function @{term "etype_of_file"} 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1391
  that we call in the grant check of RC-Model, @{term "rc_grant"}. The reason is
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1392
  that file's type can be set to a special type of @{term "InheritParent_file_type"}, 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1393
  means that the ``efficient'' type of this file is the efficient type of its directory. 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1394
  \mbox{\begin{tabular}{lcl}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1395
  @{thm (lhs) etype_aux.simps(1)} & @{text "\<equiv>"} & @{thm (rhs) etype_aux.simps(1)}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1396
  @{thm (lhs) etype_aux.simps(2)} & @{text "\<equiv>"} & @{thm (rhs) etype_aux.simps(2)}\smallskip\\ 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1397
  @{thm (lhs) etype_of_file_def} & @{text "\<equiv>"} & @{thm (rhs) etype_of_file_def}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1398
  \end{tabular}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1399
  Here @{term etype_aux} is an auxiliary function which do recursion
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1400
  on the pathname of files. By the way, in our proofs, we do proved
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1401
  that functions like @{term "etype_of_file"} will always return
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1402
  ``normal'' values.
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1403
  
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1404
 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1405
  We have similar observation functions calculating the current type for processes
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1406
  and IPCs too, only diffence here is that there is no ``effcient'' type here for 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1407
  processes and IPCs, all types that calculated by @{term "type_of_process"} and 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1408
  @{term "type_of_ipc"} are alrealdy efficient types. 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1409
8
2dab4bbb6684 fixed typos
chunhan
parents: 3
diff changeset
  1410
*)
2dab4bbb6684 fixed typos
chunhan
parents: 3
diff changeset
  1411
2dab4bbb6684 fixed typos
chunhan
parents: 3
diff changeset
  1412
(*
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1413
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1414
text {*
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1415
  \begin{isabelle}\ \ \ \ \ %%%
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1416
  \mbox{
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1417
  \begin{tabular}{r@ {\hspace{1mm}}l@ {\hspace{2mm}}l@ {\hspace{2mm}}l}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1418
  @{text t_normal_role}  & @{text "="} & @{text "WebServer"} &                  \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1419
                         & @{text "|"} & @{text "WS_client"} & @{text t_client} \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1420
                         & @{text "|"} & @{text "UpLoader"}  & @{text t_client} \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1421
                         & @{text "|"} & @{text "CGI   "}    & @{text t_client} 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1422
  \end{tabular}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1423
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1424
  \mbox{
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1425
  \begin{tabular} {r@ {\hspace{1mm}}l@ {\hspace{2mm}}l@ {\hspace{5mm}}l}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1426
  @{text t_role} 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1427
     & @{text "="} & @{term "InheritParentRole"}  & ``for file's initial/forced role, 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1428
                                                         meaning using parent directory's 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1429
                                                         role instead'' \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1430
     & @{text "|"} & @{term "UseForcedRole"}      & ``for file's initial role'' \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1431
     & @{text "|"} & @{term "InheritProcessRole"} & ``using process' current role''\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1432
     & @{text "|"} & @{term "InheritUserRole"}    & ``using owner's default role''\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1433
     & @{text "|"} &   ...                        & \\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1434
     & @{text "|"} & @{term "NormalRole t_normal_role"} & ``user-defined 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1435
                                                           policy roles" 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1436
  \end{tabular}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1437
  \end{isabelle}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1438
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1439
  @{text "t_normal roles"} are normally user-defined roles in the
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1440
  policy, where @{text "WebServer"} is the role who plays for the
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1441
  server, while @{text "WS_client"} is the role server plays for
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1442
  certain client, so is for @{text "UpLoader"} role. @{text "CGI"} is
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1443
  the role that client's programme scripts play. 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1444
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1445
  @{term "currentrole"} function calculates the current role of process, here we 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1446
  only show 3 cases of its definition, it responses to @{term "ChangeOwner"}, 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1447
  @{term "ChangeRole"} events too. 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1448
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1449
  \begin{isabelle}\ \ \ \ \ %%%
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1450
  \mbox{\begin{tabular}{lcl}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1451
  @{thm (lhs) currentrole.simps(1)} & @{text "\<equiv>"} & @{thm (rhs) currentrole.simps(1)}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1452
  @{thm (lhs) currentrole.simps(2)} & @{text "\<equiv>"} & @{thm (rhs) currentrole.simps(2)}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1453
  @{thm (lhs) currentrole.simps(3)} & @{text "\<equiv>"} & @{thm (rhs) currentrole.simps(3)}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1454
  \end{tabular}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1455
  \end{isabelle}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1456
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1457
  If the event trace is @{term "[]"}, means the
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1458
  system state currently is the initial state, then @{term "init_currentrole"} will
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1459
  do. @{term "Execute p f"} event is one complex case, when this event happens, process
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1460
  @{term p}'s role will be changed according to the efficient initial role of the 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1461
  executable file @{term f}, here ``efficient'' is like the file's type too. 
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1462
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1463
  \begin{isabelle}\ \ \ \ \ %%%
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1464
  \mbox{\begin{tabular}{lcl}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1465
  @{thm (lhs) initialrole.simps(1)} & @{text "\<equiv>"} & @{thm (rhs) initialrole.simps(1)}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1466
  @{thm (lhs) initialrole.simps(2)} & @{text "\<equiv>"} & @{thm (rhs) initialrole.simps(2)}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1467
  @{thm (lhs) initialrole.simps(3)} & @{text "\<equiv>"} & @{thm (rhs) initialrole.simps(3)}\medskip\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1468
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1469
  @{thm (lhs) erole_functor.simps(1)} & @{text "\<equiv>"} & @{thm (rhs) erole_functor.simps(1)}\\
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1470
  @{thm (lhs) erole_functor.simps(2)} & @{text "\<equiv>"} & @{thm (rhs) erole_functor.simps(2)}  
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1471
  \end{tabular}}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1472
  \end{isabelle}
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1473
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1474
  If this efficient initial role is normal role, then RC-Model assigns
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1475
  this role to the process after execution finished. Otherwise if this
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1476
  efficient initial role is using special value @{term
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1477
  "UseForcedRole"}, then the new role for the process is then
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1478
  determinated by the efficient forced role of the executable file
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1479
  @{term "forcedrole"}.  When new process is created, this process'
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1480
  role is assigned to its creator's role.
8
2dab4bbb6684 fixed typos
chunhan
parents: 3
diff changeset
  1481
2dab4bbb6684 fixed typos
chunhan
parents: 3
diff changeset
  1482
*}
11
31d3d2b3f6b0 paper update
chunhan
parents: 10
diff changeset
  1483
31d3d2b3f6b0 paper update
chunhan
parents: 10
diff changeset
  1484
31d3d2b3f6b0 paper update
chunhan
parents: 10
diff changeset
  1485
 HERE: chunhan
31d3d2b3f6b0 paper update
chunhan
parents: 10
diff changeset
  1486
Therefore we define @{term new_proc} as 
31d3d2b3f6b0 paper update
chunhan
parents: 10
diff changeset
  1487
31d3d2b3f6b0 paper update
chunhan
parents: 10
diff changeset
  1488
  (*  *)
31d3d2b3f6b0 paper update
chunhan
parents: 10
diff changeset
  1489
  \begin{isabelle}\ \ \ \ \ %%%
31d3d2b3f6b0 paper update
chunhan
parents: 10
diff changeset
  1490
  \mbox{\begin{tabular}{l@ {\hspace{2mm}}c@ {\hspace{2mm}}l}
31d3d2b3f6b0 paper update
chunhan
parents: 10
diff changeset
  1491
  @{term "new_proc s"} & @{text "\<equiv>"} & @{term "Max (current_procs s) + 1"}
31d3d2b3f6b0 paper update
chunhan
parents: 10
diff changeset
  1492
  \end{tabular}}
31d3d2b3f6b0 paper update
chunhan
parents: 10
diff changeset
  1493
  \end{isabelle}
31d3d2b3f6b0 paper update
chunhan
parents: 10
diff changeset
  1494
31d3d2b3f6b0 paper update
chunhan
parents: 10
diff changeset
  1495
  \noindent
31d3d2b3f6b0 paper update
chunhan
parents: 10
diff changeset
  1496
  namely the highest ID currently in existence increased by one.
31d3d2b3f6b0 paper update
chunhan
parents: 10
diff changeset
  1497
1
dcde836219bc add thy files
chunhan
parents:
diff changeset
  1498
*)