diff -r 13bba99ca090 -r 8557d7872fdb Co2sobj_prop.thy --- a/Co2sobj_prop.thy Wed Sep 04 09:07:39 2013 +0800 +++ b/Co2sobj_prop.thy Wed Sep 04 09:58:30 2013 +0800 @@ -415,6 +415,10 @@ apply (auto simp:cf2sfile_def sectxt_of_pf_def get_parentfs_ctxts'_def split:if_splits option.splits) done +lemma is_file_has_sfile': + "\is_file s f; valid s\ \ \ sf. cf2sfile s f = Some sf" +by (drule is_file_has_sfile, auto) + lemma is_dir_has_sfile: "\is_dir s f; valid s\ \ (case f of [] \ cf2sfile s f = Some sroot @@ -428,6 +432,14 @@ apply (auto simp:cf2sfile_def split:if_splits option.splits) done +lemma is_dir_has_sdir': + "\is_dir s f; valid s\ \ \ sf. cf2sfile s f = Some sf" +apply (case_tac f) +apply (rule_tac x = sroot in exI) +apply (simp add:sroot_only) +apply (drule is_dir_has_sfile, auto) +done + lemma sroot_set: "valid s \ \ sec. sroot = (Init [], sec, None, {}) \ sectxt_of_obj s (O_dir []) = Some sec" apply (frule root_is_dir) @@ -1598,6 +1610,714 @@ lemmas cp2sproc_simps = cp2sproc_open cp2sproc_closefd cp2sproc_attach cp2sproc_detach cp2sproc_deleteshm cp2sproc_clone cp2sproc_execve cp2sproc_kill cp2sproc_exit cp2sproc_other +lemma current_proc_has_sp: + "\p \ current_procs s; valid s\ \ \ sp. cp2sproc s p = Some sp" +by (auto simp:cp2sproc_def split:option.splits dest!:current_has_sec') + +lemma current_proc_has_sp': + "\cp2sproc s p = None; valid s\ \ p \ current_procs s" +by (auto dest:current_proc_has_sp) + + + +(* simpset for cf2sfiles *) + +lemma cf2sfiles_open: + "\valid (Open p f flag fd opt # s); f' \ current_files (Open p f flag fd opt # s)\ + \ cf2sfiles (Open p f flag fd opt # s) f' = ( + if (f' = f \ opt \ None) + then (case cf2sfile (Open p f flag fd opt # s) f of + Some sf \ {sf} + | _ \ {} ) + else cf2sfiles s f')" +apply (frule vt_grant_os, frule vd_cons) +apply (auto simp:cf2sfiles_def cf2sfile_open_none cf2sfile_simps same_inode_files_open + split:if_splits option.splits dest!:current_file_has_sfile' dest:cf2sfile_open) +apply (rule_tac x = "f'a" in bexI, drule same_inode_files_prop1, simp add:cf2sfile_open_some1, simp)+ +done + +lemma cf2sfiles_other: + "\valid (e # s); + \ p f flag fd opt. e \ Open p f flag fd opt; + \ p fd. e \ CloseFd p fd; + \ p f. e \ UnLink p f; + \ p f f'. e \ LinkHard p f f'\ \ cf2sfiles (e # s) = cf2sfiles s" +apply (frule vt_grant_os, frule vd_cons, rule ext) +apply (simp add:cf2sfiles_def, rule set_eqI, rule iffI) +apply (drule Set.CollectD, erule bexE, rule CollectI) +apply (rule_tac x = f' in bexI, case_tac e) +apply (auto simp:cf2sfiles_def cf2sfile_simps same_inode_files_simps current_files_simps + split:if_splits option.splits dest!:current_file_has_sfile' dest:same_inode_files_prop1 cf2sfile_other') +apply (drule_tac f' = f' in cf2sfile_rmdir) +apply (simp add:current_files_simps same_inode_files_prop1 same_inode_files_prop3 dir_is_empty_def)+ + +apply (rule_tac x = f' in bexI, case_tac e) +apply (auto simp:cf2sfiles_def cf2sfile_simps same_inode_files_simps current_files_simps + split:if_splits option.splits dest!:current_file_has_sfile' dest:same_inode_files_prop1 cf2sfile_other') +apply (drule_tac f' = f' in cf2sfile_rmdir) +apply (simp add:current_files_simps same_inode_files_prop1 same_inode_files_prop3 dir_is_empty_def)+ +done + +lemma cf2sfile_linkhard1': + "\valid (LinkHard p oldf f # s); f' \ same_inode_files s f''\ + \ cf2sfile (LinkHard p oldf f# s) f' = cf2sfile s f'" +apply (drule same_inode_files_prop1) +by (simp add:cf2sfile_linkhard1) + +lemma cf2sfiles_linkhard: + "valid (LinkHard p oldf f # s) \ cf2sfiles (LinkHard p oldf f # s) = (\ f'. + if (f' = f \ f' \ same_inode_files s oldf) + then (case (cf2sfile (LinkHard p oldf f # s) f) of + Some sf \ cf2sfiles s oldf \ {sf} + | _ \ {}) + else cf2sfiles s f')" +apply (frule vt_grant_os, frule vd_cons, rule ext) +apply (auto simp:cf2sfiles_def cf2sfile_linkhard1' same_inode_files_linkhard current_files_linkhard + split:if_splits option.splits dest!:current_file_has_sfile' current_has_sec' dest:same_inode_files_prop1) +done + +lemma cf2sfile_unlink': + "\valid (UnLink p f # s); f' \ same_inode_files (UnLink p f # s) f''\ + \ cf2sfile (UnLink p f # s) f' = cf2sfile s f'" +apply (drule same_inode_files_prop1) +by (simp add:cf2sfile_unlink) + +lemma cf2sfiles_unlink: + "\valid (UnLink p f # s); f' \ current_files (UnLink p f # s)\ \ cf2sfiles (UnLink p f # s) f' = ( + if (f' \ same_inode_files s f \ proc_fd_of_file s f = {} \ + (\ f'' \ same_inode_files s f. f'' \ f \ cf2sfile s f'' \ cf2sfile s f)) then + (case (cf2sfile s f) of + Some sf \ cf2sfiles s f' - {sf} + | _ \ {}) + else cf2sfiles s f')" +apply (frule vt_grant_os, frule vd_cons, simp add:current_files_simps split:if_splits) +apply (rule conjI, clarify, frule is_file_has_sfile', simp, erule exE, simp) +apply (simp add:cf2sfiles_def, rule set_eqI, rule iffI, drule CollectD) +apply (erule bexE, frule_tac f' = f' in same_inode_files_unlink) +apply (simp add:current_files_unlink, simp, erule conjE) +apply (erule_tac x = f'a in ballE, frule_tac f' = "f'a" in cf2sfile_unlink) +apply (simp add:current_files_unlink same_inode_files_prop1, simp) +apply (rule_tac x = f'a in bexI, simp, simp) +apply (drule_tac f = f and f' = f' and f'' = f'a in same_inode_files_prop4, simp+) +apply (erule conjE|erule exE|erule bexE)+ +apply (case_tac "f'a = f", simp) +apply (frule_tac f' = f' in same_inode_files_unlink, simp add:current_files_unlink) +apply (frule_tac f' = f'a in cf2sfile_unlink, simp add:current_files_unlink same_inode_files_prop1) +apply (rule_tac x = f'a in bexI, simp, simp) + +apply (rule impI)+ +apply (simp add:cf2sfiles_def, rule set_eqI, rule iffI, drule CollectD) +apply (erule bexE, frule_tac f' = f' in same_inode_files_unlink) +apply (simp add:current_files_unlink, simp, (erule conjE)+) +apply (rule_tac x = f'a in bexI, frule_tac f' = "f'a" in cf2sfile_unlink) +apply (simp add:current_files_unlink same_inode_files_prop1, simp, simp) +apply (drule CollectD, erule bexE, frule_tac f' = f' in same_inode_files_unlink) +apply (simp add:current_files_unlink, simp) +apply (case_tac "f'a = f", simp) +apply (frule_tac f = f' and f' = f in same_inode_files_prop5, simp) +apply (erule bexE, erule conjE) +apply (rule_tac x = f'' in bexI) +apply (drule_tac f' = f'' in cf2sfile_unlink, simp add:current_files_unlink same_inode_files_prop1) +apply (simp, simp, erule same_inode_files_prop4, simp) +apply (rule_tac x = f'a in bexI) +apply (drule_tac f' = f'a in cf2sfile_unlink, simp add:current_files_unlink same_inode_files_prop1) +apply (simp, simp) + + +apply (simp add:cf2sfiles_def, rule set_eqI, rule iffI, drule CollectD) +apply (erule bexE, frule_tac f' = f' in same_inode_files_unlink) +apply (simp add:current_files_unlink, simp) +apply (rule_tac x = f'a in bexI) +apply (frule_tac f' = f'a in cf2sfile_unlink) +apply (simp add:same_inode_files_prop1 current_files_unlink, simp, simp) +apply (drule CollectD, erule bexE, frule_tac f' = f' in same_inode_files_unlink) +apply (simp add:current_files_unlink, simp) +apply (rule_tac x = f'a in bexI) +apply (frule_tac f' = f'a in cf2sfile_unlink) +apply (simp add:same_inode_files_prop1 current_files_unlink, simp, simp) +done + +lemma cf2sfiles_closefd: + "\valid (CloseFd p fd # s); f' \ current_files (CloseFd p fd # s)\ \ cf2sfiles (CloseFd p fd # s) f' = ( + case (file_of_proc_fd s p fd) of + Some f \ if (f' \ same_inode_files s f \ proc_fd_of_file s f = {(p, fd)} \ f \ files_hung_by_del s \ + (\ f'' \ same_inode_files s f. f'' \ f \ cf2sfile s f'' \ cf2sfile s f)) + then (case (cf2sfile s f) of + Some sf \ cf2sfiles s f' - {sf} + | _ \ {}) + else cf2sfiles s f' + | _ \ cf2sfiles s f')" + +apply (frule vt_grant_os, frule vd_cons, case_tac "file_of_proc_fd s p fd") +apply (simp_all add:current_files_simps split:if_splits) + +apply (simp add:cf2sfiles_def, rule set_eqI, rule iffI, drule CollectD) +apply (erule bexE, frule_tac f' = f' in same_inode_files_closefd) +apply (simp add:current_files_closefd, simp) +apply (rule_tac x = f'a in bexI) +apply (frule_tac f = f'a in cf2sfile_closefd) +apply (simp add:same_inode_files_prop1 current_files_closefd, simp, simp) +apply (drule CollectD, erule bexE, frule_tac f' = f' in same_inode_files_closefd) +apply (simp add:current_files_closefd, simp) +apply (rule_tac x = f'a in bexI) +apply (frule_tac f = f'a in cf2sfile_closefd) +apply (simp add:same_inode_files_prop1 current_files_closefd, simp, simp) + +apply (rule conjI, clarify, frule file_of_pfd_is_file, simp) +apply (frule is_file_has_sfile', simp, erule exE, simp) +apply (simp add:cf2sfiles_def, rule set_eqI, rule iffI, drule CollectD) +apply (erule bexE, frule_tac f' = f' in same_inode_files_closefd) +apply (simp add:current_files_closefd, simp, erule conjE) +apply (erule_tac x = f'a in ballE, frule_tac f = "f'a" in cf2sfile_closefd) +apply (simp add:current_files_closefd same_inode_files_prop1, simp) +apply (rule_tac x = f'a in bexI, simp, simp) +apply (drule_tac f = a and f' = f' and f'' = f'a in same_inode_files_prop4, simp+) +apply (erule conjE|erule exE|erule bexE)+ +apply (case_tac "f'a = a", simp) +apply (frule_tac f' = f' in same_inode_files_closefd, simp add:current_files_closefd, simp) +apply (frule_tac f = f'a in cf2sfile_closefd, simp add:current_files_closefd same_inode_files_prop1) +apply (rule_tac x = f'a in bexI, simp, simp) + +apply (rule impI)+ +apply (simp add:cf2sfiles_def, rule set_eqI, rule iffI, drule CollectD) +apply (erule bexE, frule_tac f' = f' in same_inode_files_closefd) +apply (simp add:current_files_closefd, simp, (erule conjE)+) +apply (rule_tac x = f'a in bexI, frule_tac f = f'a in cf2sfile_closefd) +apply (simp add:current_files_closefd same_inode_files_prop1, simp, simp) +apply (drule CollectD, erule bexE, frule_tac f' = f' in same_inode_files_closefd) +apply (simp add:current_files_closefd, simp) +apply (case_tac "f'a = a", simp) +apply (frule_tac f = f' and f' = a in same_inode_files_prop5, simp) +apply (erule bexE, erule conjE) +apply (rule_tac x = f'' in bexI) +apply (drule_tac f = f'' in cf2sfile_closefd, simp add:current_files_closefd same_inode_files_prop1) +apply (simp, simp, erule same_inode_files_prop4, simp) +apply (rule_tac x = f'a in bexI) +apply (drule_tac f = f'a in cf2sfile_closefd, simp add:current_files_closefd same_inode_files_prop1) +apply (simp, simp) + +apply (rule conjI, clarify) + +apply (rule impI) +apply (case_tac "a \ files_hung_by_del s", simp_all) +apply (simp add:cf2sfiles_def, rule set_eqI, rule iffI, drule CollectD) +apply (erule bexE, frule_tac f' = f' in same_inode_files_closefd) +apply (simp add:current_files_closefd, simp) +apply (rule_tac x = f'a in bexI) +apply (frule_tac f = f'a in cf2sfile_closefd) +apply (simp add:same_inode_files_prop1 current_files_closefd, simp, simp) +apply (drule CollectD, erule bexE, frule_tac f' = f' in same_inode_files_closefd) +apply (simp add:current_files_closefd, simp) +apply (rule_tac x = f'a in bexI) +apply (frule_tac f = f'a in cf2sfile_closefd) +apply (simp add:same_inode_files_prop1 current_files_closefd, simp, simp) +apply (simp add:cf2sfiles_def, rule set_eqI, rule iffI, drule CollectD) +apply (erule bexE, frule_tac f' = f' in same_inode_files_closefd) +apply (simp add:current_files_closefd, simp) +apply (rule_tac x = f'a in bexI) +apply (frule_tac f = f'a in cf2sfile_closefd) +apply (simp add:same_inode_files_prop1 current_files_closefd, simp, simp) +apply (drule CollectD, erule bexE, frule_tac f' = f' in same_inode_files_closefd) +apply (simp add:current_files_closefd, simp) +apply (rule_tac x = f'a in bexI) +apply (frule_tac f = f'a in cf2sfile_closefd) +apply (simp add:same_inode_files_prop1 current_files_closefd, simp, simp) +done + +lemmas cf2sfiles_simps = cf2sfiles_open cf2sfiles_linkhard cf2sfiles_other + cf2sfiles_unlink cf2sfiles_closefd + + +(* simpset for co2sobj *) + +lemma co2sobj_execve: + "\valid (Execve p f fds # s); alive s obj\ \ co2sobj (Execve p f fds # s) obj = ( + if (obj = O_proc p) + then (case (cp2sproc (Execve p f fds # s) p) of + Some sp \ Some (S_proc sp (O_proc p \ Tainted s \ O_file f \ Tainted s)) + | _ \ None) + else co2sobj s obj )" +apply (frule vt_grant_os, frule vd_cons, case_tac obj) +apply (simp_all add:current_files_simps cf2sfiles_other ch2sshm_other cq2smsgq_other tainted_eq_Tainted) +apply (case_tac "cp2sproc (Execve p f fds # s) p") +apply (drule current_proc_has_sp', simp, simp) +apply (simp (no_asm_simp) add:cp2sproc_execve tainted_eq_Tainted split:option.splits) +apply (frule_tac s = s in is_dir_has_sdir', simp, erule exE, simp) +apply (frule_tac ff = list in cf2sfile_other', simp_all) +apply (simp add:is_dir_in_current) +done + +lemma co2sobj_clone: + "\valid (Clone p p' fds shms # s); alive s obj\ \ co2sobj (Clone p p' fds shms # s) obj = ( + if (obj = O_proc p') + then (case (cp2sproc (Clone p p' fds shms # s) p') of + Some sp \ Some (S_proc sp (O_proc p \ Tainted s)) + | _ \ None) + else co2sobj s obj )" +apply (frule vt_grant_os, frule vd_cons, case_tac obj) +apply (simp_all add:current_files_simps cf2sfiles_other ch2sshm_other cq2smsgq_other tainted_eq_Tainted) +apply (case_tac "cp2sproc (Clone p p' fds shms # s) p'") +apply (drule current_proc_has_sp', simp, simp) +apply ((erule conjE)+, frule_tac p = p in current_proc_has_sec, simp, erule exE, simp) +apply (rule conjI, rule impI, simp) +apply (simp (no_asm_simp) add:cp2sproc_clone tainted_eq_Tainted split:option.splits) + +apply (frule_tac s = s in is_dir_has_sdir', simp, erule exE, simp) +apply (frule_tac ff = list in cf2sfile_other', simp_all) +apply (simp add:is_dir_in_current) +done + +lemma co2sobj_ptrace: + "\valid (Ptrace p p' # s); alive s obj\\ co2sobj (Ptrace p p' # s) obj = ( + case obj of + O_proc p'' \ if (info_flow_shm s p' p'') + then (case (cp2sproc s p'') of + Some sp \ Some (S_proc sp (O_proc p'' \ Tainted s \ O_proc p \ Tainted s)) + | _ \ None) + else if (info_flow_shm s p p'') + then (case (cp2sproc s p'') of + Some sp \ Some (S_proc sp (O_proc p'' \ Tainted s \ O_proc p' \ Tainted s)) + | _ \ None) + else co2sobj s (O_proc p'') + | _ \ co2sobj s obj)" +apply (frule vt_grant_os, frule vd_cons, case_tac obj) +apply (simp_all add:current_files_simps ch2sshm_other cq2smsgq_other cf2sfiles_other tainted_eq_Tainted) + +apply (auto simp:cp2sproc_other tainted_eq_Tainted split:option.splits + dest!:current_proc_has_sec' current_proc_has_sp' intro:info_flow_shm_Tainted)[1] + +apply (frule_tac s = s in is_dir_has_sdir', simp, erule exE, simp) +apply (frule_tac ff = list in cf2sfile_other', simp_all) +apply (simp add:is_dir_in_current) +done + +lemma co2sobj_open: + "\valid (Open p f flag fd opt # s); alive (Open p f flag fd opt # s) obj\ + \ co2sobj (Open p f flag fd opt # s) obj = (case obj of + O_file f' \ if (f' = f \ opt \ None) + then (case (cf2sfile (Open p f flag fd opt # s) f) of + Some sf \ Some (S_file {sf} (O_proc p \ Tainted s)) + | _ \ None) + else co2sobj s (O_file f') + | O_proc p' \ if (p' = p) + then (case (cp2sproc (Open p f flag fd opt # s) p) of + Some sp \ Some (S_proc sp (O_proc p \ Tainted s)) + | _ \ None) + else co2sobj s (O_proc p') + | _ \ co2sobj s obj )" +apply (frule vt_grant_os, frule vd_cons, case_tac obj) +apply (auto simp:cp2sproc_simps tainted_eq_Tainted split:option.splits + dest!:current_proc_has_sp' intro:info_flow_shm_Tainted)[1] + +apply (simp split:if_splits t_object.splits) +apply (rule conjI, rule impI, erule conjE, erule exE, simp, (erule exE|erule conjE)+) +apply (case_tac "cf2sfile (Open p f flag fd (Some y) # s) f") +apply (drule current_file_has_sfile', simp, simp add:current_files_simps, simp) +apply (frule_tac f' = f in cf2sfiles_open, simp add:current_files_simps) +apply (simp add:tainted_eq_Tainted) +apply (rule impI, rule notI, drule Tainted_in_current, simp, simp add:is_file_in_current) +apply (rule impI, simp add:tainted_eq_Tainted cf2sfiles_open is_file_in_current split:option.splits) + +apply (simp_all add:current_files_simps is_dir_simps ch2sshm_other cq2smsgq_other tainted_eq_Tainted) + +apply (frule is_dir_in_current) +apply (frule_tac f' = list in cf2sfile_open) +apply (simp add:current_files_simps split:option.splits) +apply (simp split:if_splits option.splits) +done + +lemma co2sobj_readfile: + "\valid (ReadFile p fd # s); alive s obj\ \ co2sobj (ReadFile p fd # s) obj = ( + case obj of + O_proc p' \ (case (file_of_proc_fd s p fd) of + Some f \ (if (info_flow_shm s p p' \ O_file f \ Tainted s) + then (case (cp2sproc s p') of + Some sp \ Some (S_proc sp True) + | _ \ None) + else co2sobj s obj) + | _ \ None) + | _ \ co2sobj s obj)" +apply (frule vt_grant_os, frule vd_cons, case_tac obj) +apply (auto simp:cp2sproc_simps tainted_eq_Tainted split:option.splits + dest!:current_proc_has_sp' intro:info_flow_shm_Tainted)[1] +apply (simp_all add:current_files_simps is_dir_simps ch2sshm_other cq2smsgq_other tainted_eq_Tainted) + +apply (auto split:if_splits option.splits dest!:current_file_has_sfile' + simp:current_files_simps cf2sfiles_simps cf2sfile_simps + dest:is_file_in_current is_dir_in_current) +done + +lemma co2sobj_writefile: + "\valid (WriteFile p fd # s); alive s obj\ \ co2sobj (WriteFile p fd # s) obj = ( + case obj of + O_file f' \ (case (file_of_proc_fd s p fd) of + Some f \ (if (f \ same_inode_files s f') + then Some (S_file (cf2sfiles s f') + (O_file f' \ Tainted s \ O_proc p \ Tainted s)) + else co2sobj s obj) + | _ \ None) + | _ \ co2sobj s obj)" +apply (frule vt_grant_os, frule vd_cons, case_tac obj) +apply (simp_all add:current_files_simps is_dir_simps ch2sshm_other cq2smsgq_other tainted_eq_Tainted) + +apply (auto split:if_splits option.splits dest!:current_file_has_sfile' current_proc_has_sp' + simp:current_files_simps cf2sfiles_simps cf2sfile_simps cp2sproc_simps tainted_eq_Tainted + same_inode_files_prop6 + dest:is_file_in_current is_dir_in_current) + +(* should delete has_same_inode !?!?*) +by (auto simp:same_inode_files_def is_file_def has_same_inode_def split:if_splits option.splits) + +lemma co2sobj_closefd: + "\valid (CloseFd p fd # s); alive (CloseFd p fd # s) obj\ \ co2sobj (CloseFd p fd # s) obj = ( + case obj of + O_file f' \ (case (file_of_proc_fd s p fd) of + Some f \ (if (f' \ same_inode_files s f \ proc_fd_of_file s f = {(p, fd)} \ + f \ files_hung_by_del s \ (\ f'' \ same_inode_files s f. + f'' \ f \ cf2sfile s f'' \ cf2sfile s f)) + then (case (cf2sfile s f, co2sobj s (O_file f')) of + (Some sf, Some (S_file sfs b)) \ Some (S_file (sfs - {sf}) b) + | _ \ None) + else co2sobj s obj) + | _ \ co2sobj s obj) + | O_proc p' \ (if (p = p') + then (case (cp2sproc (CloseFd p fd # s) p) of + Some sp \ Some (S_proc sp (O_proc p \ Tainted s)) + | _ \ None) + else co2sobj s obj) + | _ \ co2sobj s obj) " +apply (frule vt_grant_os, frule vd_cons, case_tac obj) +apply (simp_all add:current_files_simps ch2sshm_other cq2smsgq_other tainted_eq_Tainted) +apply (auto simp:cp2sproc_simps tainted_eq_Tainted split:option.splits if_splits + dest!:current_proc_has_sp' intro:info_flow_shm_Tainted)[1] + +apply (frule is_file_in_current) +apply (case_tac "file_of_proc_fd s p fd") +apply (simp add:tainted_eq_Tainted) +apply (drule_tac f' = list in cf2sfiles_closefd, simp add:current_files_closefd, simp) +apply (frule_tac f' = list in cf2sfiles_closefd, simp) +apply (simp add:is_file_simps current_files_simps) +apply (auto simp add:tainted_eq_Tainted cf2sfile_closefd split:if_splits option.splits + dest!:current_file_has_sfile' dest:hung_file_in_current)[1] + +apply (simp add:is_dir_simps, frule is_dir_in_current) +apply (frule_tac f = list in cf2sfile_closefd) +apply (clarsimp simp:current_files_closefd split:option.splits) +apply (drule file_of_pfd_is_file', simp+) +done + +lemma co2sobj_unlink: + "\valid (UnLink p f # s); alive (UnLink p f # s) obj\ \ co2sobj (UnLink p f # s) obj = ( + case obj of + O_file f' \ if (f' \ same_inode_files s f \ proc_fd_of_file s f = {} \ + (\ f'' \ same_inode_files s f. f'' \ f \ cf2sfile s f'' \ cf2sfile s f)) + then (case (cf2sfile s f, co2sobj s (O_file f')) of + (Some sf, Some (S_file sfs b)) \ Some (S_file (sfs - {sf}) b) + | _ \ None) + else co2sobj s obj + | _ \ co2sobj s obj)" +apply (frule vt_grant_os, frule vd_cons, case_tac obj) +apply (simp_all add:current_files_simps ch2sshm_other cq2smsgq_other tainted_eq_Tainted) +apply (auto simp:cp2sproc_simps tainted_eq_Tainted split:option.splits if_splits + dest!:current_proc_has_sp' intro:info_flow_shm_Tainted)[1] +apply (frule is_file_in_current) +apply (frule_tac f' = list in cf2sfile_unlink, simp) +apply (frule_tac f' = list in cf2sfiles_unlink, simp) +apply (simp add:is_file_simps current_files_simps) +apply (auto simp add:tainted_eq_Tainted is_file_in_current split:if_splits option.splits + dest!:current_file_has_sfile')[1] + +apply (simp add:is_dir_simps, frule is_dir_in_current) +apply (frule_tac f' = list in cf2sfile_unlink) +apply (clarsimp simp:current_files_unlink split:option.splits) +apply (drule file_dir_conflict, simp+) +done + +lemma co2sobj_rmdir: + "\valid (Rmdir p f # s); alive (Rmdir p f # s) obj\ \ co2sobj (Rmdir p f # s) obj = co2sobj s obj" +apply (frule vt_grant_os, frule vd_cons, case_tac obj) +apply (simp_all add:current_files_simps ch2sshm_other cq2smsgq_other tainted_eq_Tainted) +apply (auto simp:cp2sproc_simps tainted_eq_Tainted split:option.splits if_splits + dest!:current_proc_has_sp' intro:info_flow_shm_Tainted)[1] +apply (simp add:is_file_simps dir_is_empty_def) +apply (case_tac "f = list", drule file_dir_conflict, simp, simp) +apply (simp add:cf2sfiles_other) +apply (auto simp:cf2sfile_simps dest:is_dir_in_current) +done + +lemma co2sobj_mkdir: + "\valid (Mkdir p f i # s); alive (Mkdir p f i # s) obj\ \ co2sobj (Mkdir p f i # s) obj = ( + if (obj = O_dir f) + then (case (cf2sfile (Mkdir p f i # s) f) of + Some sf \ Some (S_dir sf) + | _ \ None) + else co2sobj s obj)" +apply (frule vt_grant_os, frule vd_cons, case_tac obj) +apply (simp_all add:current_files_simps ch2sshm_other cq2smsgq_other tainted_eq_Tainted) +apply (auto simp:cp2sproc_simps tainted_eq_Tainted split:option.splits if_splits + dest!:current_proc_has_sp' intro:info_flow_shm_Tainted)[1] +apply (frule_tac cf2sfiles_other, simp+) +apply (frule is_dir_in_current, rule impI, simp add:current_files_mkdir) +apply (frule current_file_has_sfile, simp, erule exE, simp) +apply (drule cf2sfile_mkdir1, simp+) +done + +lemma same_inodes_Tainted: + "\f \ same_inode_files s f'; valid s\ \ (O_file f \ Tainted s) = (O_file f' \ Tainted s)" +apply (frule same_inode_files_prop8, frule same_inode_files_prop7) +apply (auto intro:has_same_inode_Tainted) +done + +lemma co2sobj_linkhard: + "\valid (LinkHard p oldf f # s); alive (LinkHard p oldf f # s) obj\ + \ co2sobj (LinkHard p oldf f # s) obj = ( + case obj of + O_file f' \ if (f' = f \ f' \ same_inode_files s oldf) + then (case (cf2sfile (LinkHard p oldf f # s) f) of + Some sf \ Some (S_file (cf2sfiles s oldf \ {sf}) (O_file oldf \ Tainted s)) + | _ \ None) + else co2sobj s obj + | _ \ co2sobj s obj)" +apply (frule vt_grant_os, frule vd_cons, case_tac obj) +apply (simp_all add:current_files_simps ch2sshm_other cq2smsgq_other tainted_eq_Tainted) +apply (auto simp:cp2sproc_simps tainted_eq_Tainted split:option.splits if_splits + dest!:current_proc_has_sp' intro:info_flow_shm_Tainted)[1] +apply (frule_tac cf2sfiles_linkhard, simp+) +apply (frule_tac f' = f in cf2sfile_linkhard, simp add:current_files_linkhard) +apply (auto simp:is_file_simps sectxt_of_obj_simps current_files_simps is_file_in_current same_inodes_Tainted + split:option.splits if_splits dest:Tainted_in_current + dest!:current_has_sec' current_file_has_sfile')[1] + +apply (frule is_dir_in_current, simp add:current_files_linkhard is_dir_simps is_dir_in_current) +apply (frule is_dir_in_current) +apply (frule current_file_has_sfile, simp) +apply (drule cf2sfile_linkhard1, simp+) +done + +lemma co2sobj_truncate: + "\valid (Truncate p f len # s); alive s obj\ \ co2sobj (Truncate p f len # s) obj = ( + case obj of + O_file f' \ if (f' \ same_inode_files s f \ len > 0) + then Some (S_file (cf2sfiles s f') (O_file f' \ Tainted s \ O_proc p \ Tainted s)) + else co2sobj s obj + | _ \ co2sobj s obj)" +apply (frule vt_grant_os, frule vd_cons, case_tac obj) +apply (simp_all add:current_files_simps is_dir_simps ch2sshm_other cq2smsgq_other tainted_eq_Tainted) + +apply (auto split:if_splits option.splits dest!:current_file_has_sfile' current_proc_has_sp' + simp:current_files_simps cf2sfiles_simps cf2sfile_simps cp2sproc_simps tainted_eq_Tainted + same_inode_files_prop6 + dest:is_file_in_current is_dir_in_current) + +(* should delete has_same_inode !?!?*) +by (auto simp:same_inode_files_def is_file_def has_same_inode_def split:if_splits option.splits) + +lemma co2sobj_kill: + "\valid (Kill p p' # s); alive (Kill p p' # s) obj\ \ co2sobj (Kill p p' # s) obj = co2sobj s obj" +apply (frule vt_grant_os, frule vd_cons, case_tac obj) +apply (simp_all add:current_files_simps is_dir_simps ch2sshm_other cq2smsgq_other tainted_eq_Tainted) +apply (auto split:if_splits option.splits dest!:current_file_has_sfile' current_proc_has_sp' + simp:current_files_simps cf2sfiles_simps cf2sfile_simps cp2sproc_simps tainted_eq_Tainted + same_inode_files_prop6 + dest:is_file_in_current is_dir_in_current) +done + +lemma co2sobj_exit: + "\valid (Exit p # s); alive (Exit p # s) obj\ \ co2sobj (Exit p # s) obj = co2sobj s obj" +apply (frule vt_grant_os, frule vd_cons, case_tac obj) +apply (simp_all add:current_files_simps is_dir_simps ch2sshm_other cq2smsgq_other tainted_eq_Tainted) +apply (auto split:if_splits option.splits dest!:current_file_has_sfile' current_proc_has_sp' + simp:current_files_simps cf2sfiles_simps cf2sfile_simps cp2sproc_simps tainted_eq_Tainted + same_inode_files_prop6 + dest:is_file_in_current is_dir_in_current) +done + +lemma co2sobj_createmsgq: + "\valid (CreateMsgq p q # s); alive (CreateMsgq p q # s) obj\ \ co2sobj (CreateMsgq p q # s) obj = ( + case obj of + O_msgq q' \ if (q' = q) then (case (cq2smsgq (CreateMsgq p q # s) q) of + Some sq \ Some (S_msgq sq) + | _ \ None) + else co2sobj s obj + | _ \ co2sobj s obj)" +apply (frule vt_grant_os, frule vd_cons, case_tac obj) +apply (simp_all add:current_files_simps is_dir_simps ch2sshm_other cq2smsgq_other tainted_eq_Tainted) +apply (auto split:if_splits option.splits dest!:current_file_has_sfile' current_proc_has_sp' + simp:current_files_simps cf2sfiles_simps cf2sfile_simps cp2sproc_simps tainted_eq_Tainted + same_inode_files_prop6 + dest!:current_has_smsgq' + dest:is_file_in_current is_dir_in_current cq2smsg_createmsgq) +done + +lemma co2sobj_sendmsg: + "\valid (SendMsg p q m # s); alive (SendMsg p q m # s) obj\ \ co2sobj (SendMsg p q m # s) obj = ( + case obj of + O_msgq q' \ if (q' = q) then (case (cq2smsgq (SendMsg p q m # s) q) of + Some sq \ Some (S_msgq sq) + | _ \ None) + else co2sobj s obj + | _ \ co2sobj s obj)" +apply (frule vt_grant_os, frule vd_cons, case_tac obj) +apply (simp_all add:current_files_simps is_dir_simps ch2sshm_other cq2smsgq_other tainted_eq_Tainted) +apply (auto split:if_splits option.splits dest!:current_file_has_sfile' current_proc_has_sp' + simp:current_files_simps cf2sfiles_simps cf2sfile_simps cp2sproc_simps tainted_eq_Tainted + same_inode_files_prop6 + dest!:current_has_smsgq' + dest:is_file_in_current is_dir_in_current cq2smsg_sendmsg) +done + +lemma co2sobj_recvmsg: + "\valid (RecvMsg p q m # s); alive (RecvMsg p q m # s) obj\ \ co2sobj (RecvMsg p q m # s) obj = ( + case obj of + O_msgq q' \ if (q' = q) then (case (cq2smsgq (RecvMsg p q m # s) q) of + Some sq \ Some (S_msgq sq) + | _ \ None) + else co2sobj s obj + | O_proc p' \ if (info_flow_shm s p p' \ O_msg q m \ Tainted s) + then (case (cp2sproc s p') of + Some sp \ Some (S_proc sp True) + | _ \ None) + else co2sobj s obj + | _ \ co2sobj s obj)" +apply (frule vt_grant_os, frule vd_cons, case_tac obj) +apply (simp_all add:current_files_simps is_dir_simps ch2sshm_other cq2smsgq_other tainted_eq_Tainted) +apply (auto split:if_splits option.splits dest!:current_file_has_sfile' current_proc_has_sp' + simp:current_files_simps cf2sfiles_simps cf2sfile_simps cp2sproc_simps tainted_eq_Tainted + same_inode_files_prop6 + dest!:current_has_smsgq' + dest:is_file_in_current is_dir_in_current cq2smsg_recvmsg) +done + +lemma co2sobj_removemsgq: + "\valid (RemoveMsgq p q # s); alive (RemoveMsgq p q # s) obj\ + \ co2sobj (RemoveMsgq p q # s) obj = co2sobj s obj" +apply (frule vt_grant_os, frule vd_cons, case_tac obj) +apply (simp_all add:current_files_simps is_dir_simps ch2sshm_other cq2smsgq_other tainted_eq_Tainted) +apply (auto split:if_splits option.splits dest!:current_file_has_sfile' current_proc_has_sp' + simp:current_files_simps cf2sfiles_simps cf2sfile_simps cp2sproc_simps tainted_eq_Tainted + same_inode_files_prop6 + dest!:current_has_smsgq' + dest:is_file_in_current is_dir_in_current cq2smsg_removemsgq) +done + +lemma co2sobj_createshm: + "\valid (CreateShM p h # s); alive s obj\ \ co2sobj (CreateShM p h # s) obj = co2sobj s obj" +apply (frule vt_grant_os, frule vd_cons, case_tac obj) +apply (simp_all add:current_files_simps is_dir_simps ch2sshm_other cq2smsgq_other tainted_eq_Tainted) +apply (auto split:if_splits option.splits dest!:current_file_has_sfile' current_proc_has_sp' + simp:current_files_simps cf2sfiles_simps cf2sfile_simps cp2sproc_simps tainted_eq_Tainted + same_inode_files_prop6 ch2sshm_simps + dest!:current_shm_has_sh' + dest:is_file_in_current is_dir_in_current) +done + +lemma co2sobj_detach: + "\valid (Detach p h # s); alive s obj\ \ co2sobj (Detach p h # s) obj = ( + case obj of + O_proc p' \ if (p' = p) then (case (cp2sproc (Detach p h # s) p) of + Some sp \ Some (S_proc sp (O_proc p \ Tainted s)) + | _ \ None) + else co2sobj s obj + | _ \ co2sobj s obj)" +apply (frule vt_grant_os, frule vd_cons, case_tac obj) +apply (simp_all add:current_files_simps is_dir_simps ch2sshm_other cq2smsgq_other tainted_eq_Tainted) + +apply (auto split:if_splits option.splits dest!:current_file_has_sfile' current_proc_has_sp' + simp:current_files_simps cf2sfiles_simps cf2sfile_simps cp2sproc_simps tainted_eq_Tainted + same_inode_files_prop6 ch2sshm_simps + dest!:current_shm_has_sh' + dest:is_file_in_current is_dir_in_current) +done + +lemma co2sobj_deleteshm: + "\valid (DeleteShM p h # s); alive (DeleteShM p h # s) obj\ \ co2sobj (DeleteShM p h # s) obj = ( + case obj of + O_proc p' \ (case (cp2sproc (DeleteShM p h # s) p') of + Some sp \ Some (S_proc sp (O_proc p' \ Tainted s)) + | _ \ None) + | _ \ co2sobj s obj)" +apply (frule vt_grant_os, frule vd_cons, case_tac obj) +apply (simp_all add:current_files_simps is_dir_simps ch2sshm_other cq2smsgq_other tainted_eq_Tainted) + +apply (auto split:if_splits option.splits dest!:current_file_has_sfile' current_proc_has_sp' + simp:current_files_simps cf2sfiles_simps cf2sfile_simps tainted_eq_Tainted + same_inode_files_prop6 ch2sshm_simps + dest!:current_shm_has_sh' + dest:is_file_in_current is_dir_in_current) +done + +lemma co2sobj_attach: + "\valid (Attach p h flag # s); alive s obj\ \ co2sobj (Attach p h flag # s) obj = ( + case obj of + O_proc p' \ if (p' = p) + then (case (cp2sproc (Attach p h flag # s) p) of + Some sp \ Some (S_proc sp (O_proc p \ Tainted s \ + (\ p'. O_proc p' \ Tainted s \ (p', SHM_RDWR) \ procs_of_shm s h))) + | _ \ None) + else if (\ flag'. (p', flag') \ procs_of_shm s h) + then (case (cp2sproc s p') of + Some sp \ Some (S_proc sp (O_proc p' \ Tainted s \ + (O_proc p \ Tainted s \ flag = SHM_RDWR))) + | _ \ None) + else co2sobj s obj + | _ \ co2sobj s obj)" +apply (frule vt_grant_os, frule vd_cons, case_tac obj) +apply (simp_all add:current_files_simps is_dir_simps ch2sshm_other cq2smsgq_other tainted_eq_Tainted) + +apply (rule conjI|rule impI|erule exE)+ +apply (simp split:option.splits) +apply (rule impI, frule current_proc_has_sp, simp) +apply ((erule exE)+, auto simp:cp2sproc_attach tainted_eq_Tainted)[1] +apply (rule impI|rule conjI)+ +apply (subgoal_tac "p \ current_procs (Attach p h flag # s)") +apply (drule_tac p = p in current_proc_has_sp, simp, erule exE) +apply (auto simp:tainted_eq_Tainted)[1] +apply (simp, rule impI) +apply (subgoal_tac "nat \ current_procs (Attach p h flag # s)") +apply (drule_tac p = nat in current_proc_has_sp, simp, erule exE) +apply (drule_tac p = nat in current_proc_has_sp, simp, erule exE) +apply (auto simp:cp2sproc_attach tainted_eq_Tainted)[1] +apply simp + +apply (auto split:if_splits option.splits dest!:current_file_has_sfile' + simp:current_files_simps cf2sfiles_simps cf2sfile_simps tainted_eq_Tainted + same_inode_files_prop6 + dest:is_file_in_current is_dir_in_current) +done + + +lemma co2sobj_other: + "\valid (e # s); alive (e # s) obj; + \ p f fds. e \ Execve p f fds; + \ p p' fds shms. e \ Clone p p' fds shms; + \ p p'. e \ Ptrace p p'; + \ p f flags fd opt. e \ Open p f flags fd opt; + \ p fd. e \ ReadFile p fd; + \ p fd. e \ WriteFile p fd; + \ p fd. e \ CloseFd p fd; + \ p f. e \ UnLink p f; + \ p f. e \ Rmdir p f; + \ p f i. e \ Mkdir p f i; + \ p f f'. e \ LinkHard p f f'; + \ p f len. e \ Truncate p f len; + \ p q. e \ CreateMsgq p q; + \ p q m. e \ SendMsg p q m; + \ p q m. e \ RecvMsg p q m; + \ p q. e \ RemoveMsgq p q; + \ p h. e \ CreateShM p h; + \ p h flag. e \ Attach p h flag; + \ p h. e \ Detach p h; + \ p h. e \ DeleteShM p h + \ \ co2sobj (e # s) obj = co2sobj s obj" +apply (frule vt_grant, case_tac e) +apply (auto intro:co2sobj_kill co2sobj_exit) +done + +lemmas co2sobj_simps = co2sobj_execve co2sobj_clone co2sobj_ptrace co2sobj_open co2sobj_readfile + co2sobj_writefile co2sobj_closefd co2sobj_unlink co2sobj_rmdir co2sobj_mkdir co2sobj_linkhard + co2sobj_truncate co2sobj_kill co2sobj_exit co2sobj_createmsgq co2sobj_sendmsg co2sobj_recvmsg + co2sobj_removemsgq co2sobj_attach co2sobj_detach co2sobj_createshm co2sobj_deleteshm + end (*<*)