@@ -18,6 +18,18 @@ func larakcpath() -> String? {
1818}
1919
2020func fetchkcache( ) -> Bool {
21+ guard ds_is_ready ( ) ,
22+ off_proc_p_fd != 0 ,
23+ off_filedesc_fd_ofiles != 0 ,
24+ off_fileproc_fp_glob != 0 ,
25+ off_fileglob_fg_data != 0 ,
26+ off_vnode_v_data != 0 ,
27+ off_namecache_nc_vp != 0 ,
28+ off_namecache_nc_child_tqe_next != 0 else {
29+ globallogger. log ( " (fetchkcache) exploit or offsets not ready " )
30+ return false
31+ }
32+
2133 guard let kcpath = syskcpath ( ) else {
2234 globallogger. log ( " (fetchkcache) failed to get kernelcache path " )
2335 return false
@@ -63,23 +75,59 @@ func fetchkcache() -> Bool {
6375 }
6476
6577 var buffer = [ UInt8] ( repeating: 0 , count: 0x4000 )
78+ let bufferSize = buffer. count
79+ var totalBytes = 0
6680
6781 while true {
68- let n = read ( src, & buffer, buffer. count)
82+ let n = buffer. withUnsafeMutableBytes { rawBuffer in
83+ read ( src, rawBuffer. baseAddress!, bufferSize)
84+ }
6985
70- if n <= 0 {
86+ if n < 0 {
87+ globallogger. log ( " (fetchkcache) failed to read kernelcache " )
88+ return false
89+ }
90+
91+ if n == 0 {
7192 break
7293 }
7394
74- _ = write ( dst, buffer, n)
95+ var written = 0
96+ while written < n {
97+ let w = buffer. withUnsafeBytes { rawBuffer in
98+ write ( dst, rawBuffer. baseAddress!. advanced ( by: written) , n - written)
99+ }
100+
101+ if w <= 0 {
102+ globallogger. log ( " (fetchkcache) failed to write kernelcache " )
103+ return false
104+ }
105+
106+ written += w
107+ }
108+
109+ totalBytes += n
110+ }
111+
112+ if !FileManager. default. fileExists ( atPath: outpath) || totalBytes == 0 {
113+ globallogger. log ( " (fetchkcache) kernelcache output missing " )
114+ return false
75115 }
76116
77- if !FileManager . default . fileExists ( atPath : outpath) {
117+ guard let handle = FileHandle ( forReadingAtPath : outpath) else {
78118 globallogger. log ( " (fetchkcache) kernelcache output missing " )
79119 return false
80- } else {
81- globallogger. log ( " (fetchkcache) kernelcache fetch success! " )
82120 }
83121
122+ let magic = handle. readData ( ofLength: 2 )
123+ handle. closeFile ( )
124+
125+ guard magic. count == 2 , magic [ magic. startIndex] == 0x30 , magic [ magic. index ( after: magic. startIndex) ] == 0x84 else {
126+ unlink ( outpath)
127+ globallogger. log ( " (fetchkcache) invalid kernelcache output " )
128+ return false
129+ }
130+
131+ globallogger. log ( " (fetchkcache) kernelcache fetch success! " )
84132 return true
85133}
0 commit comments