# HG changeset patch # User chunhan # Date 1378256859 -28800 # Node ID 13bba99ca09029ff4c096a00dc8a1d44c13641e8 # Parent 9dfc8c72565a12bb81c0d06d058bfd6adc85eed5 done with co2sobj_simps diff -r 9dfc8c72565a -r 13bba99ca090 S2ss_prop.thy --- a/S2ss_prop.thy Tue Sep 03 09:31:40 2013 +0800 +++ b/S2ss_prop.thy Wed Sep 04 09:07:39 2013 +0800 @@ -143,9 +143,11 @@ lemma same_inode_files_prop7: "f' \ same_inode_files s f \ has_same_inode s f f'" -thm has_same_inode_def -apply (auto simp:same_inode_files_def is_file_def has_same_inode_def split:if_splits) +by (auto simp:same_inode_files_def is_file_def has_same_inode_def split:if_splits option.splits) +lemma same_inode_files_prop8: + "f' \ same_inode_files s f \ has_same_inode s f' f" +by (auto simp:same_inode_files_def is_file_def has_same_inode_def split:if_splits option.splits) (* simpset for cf2sfiles *) @@ -491,24 +493,359 @@ 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) -thm has_same_inode_def -done + +(* 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 s obj\ \ co2sobj (CloseFd p fd # s) obj = ( + "\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 " + 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 +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 (* simpset for s2ss*) diff -r 9dfc8c72565a -r 13bba99ca090 Static.thy --- a/Static.thy Tue Sep 03 09:31:40 2013 +0800 +++ b/Static.thy Wed Sep 04 09:07:39 2013 +0800 @@ -101,10 +101,10 @@ | "init_obj2sobj (O_file f) = Some (S_file (init_cf2sfiles f) (\ f'. f' \ (init_same_inode_files f) \ O_file f \ seeds))" -| "init_obj2sobj (O_dir f) = +| "init_obj2sobj (O_dir f) = (case (init_cf2sfile f) of - Some sf \ Some (S_dir sf) - | _ \ None)" + Some sf \ Some (S_dir sf) + | _ \ None)" | "init_obj2sobj (O_msgq q) = (case (init_cq2smsgq q) of Some sq \ Some (S_msgq sq)