@@ -26,7 +26,8 @@ use std::ptr;
2626use suricata_sys:: sys:: {
2727 DetectEngineCtx , SCDetectBufferSetActiveList , SCDetectHelperBufferProgressMpmRegister ,
2828 SCDetectHelperKeywordAliasRegister , SCDetectHelperKeywordRegister ,
29- SCDetectSignatureSetAppProto , SCSigMatchSilentErrorEnabled , SCSigTableAppLiteElmt , Signature ,
29+ SCDetectRegisterBufferLowerMd5Callbacks , SCDetectSignatureSetAppProto ,
30+ SCSigMatchSilentErrorEnabled , SCSigTableAppLiteElmt , Signature ,
3031} ;
3132
3233#[ no_mangle]
@@ -88,31 +89,31 @@ pub unsafe extern "C" fn SCSshTxGetSoftware(
8889
8990#[ no_mangle]
9091pub unsafe extern "C" fn SCSshTxGetHassh (
91- tx : * mut std :: os :: raw :: c_void , buffer : * mut * const u8 , buffer_len : * mut u32 , direction : u8 ,
92- ) -> u8 {
92+ tx : * const c_void , direction : u8 , buffer : * mut * const u8 , buffer_len : * mut u32 ,
93+ ) -> bool {
9394 let tx = cast_pointer ! ( tx, SSHTransaction ) ;
9495 match direction. into ( ) {
9596 Direction :: ToServer => {
9697 let m = & tx. cli_hdr . hassh ;
9798 if !m. is_empty ( ) {
9899 * buffer = m. as_ptr ( ) ;
99100 * buffer_len = m. len ( ) as u32 ;
100- return 1 ;
101+ return true ;
101102 }
102103 }
103104 Direction :: ToClient => {
104105 let m = & tx. srv_hdr . hassh ;
105106 if !m. is_empty ( ) {
106107 * buffer = m. as_ptr ( ) ;
107108 * buffer_len = m. len ( ) as u32 ;
108- return 1 ;
109+ return true ;
109110 }
110111 }
111112 }
112113 * buffer = ptr:: null ( ) ;
113114 * buffer_len = 0 ;
114115
115- return 0 ;
116+ return false ;
116117}
117118
118119#[ no_mangle]
@@ -212,6 +213,50 @@ unsafe extern "C" fn ssh_hassh_server_string_setup(
212213 return 0 ;
213214}
214215
216+ unsafe extern "C" fn ssh_hassh_setup (
217+ de : * mut DetectEngineCtx , s : * mut Signature , _raw : * const std:: os:: raw:: c_char ,
218+ ) -> c_int {
219+ if SCDetectSignatureSetAppProto ( s, ALPROTO_SSH ) != 0 {
220+ return -1 ;
221+ }
222+ if SCDetectBufferSetActiveList ( de, s, G_SSH_HASSH_BUFFER_ID ) < 0 {
223+ return -1 ;
224+ }
225+ /* try to enable Hassh */
226+ SCSshEnableHassh ( ) ;
227+
228+ /* Check if Hassh is disabled */
229+ if !SCSshHasshIsEnabled ( ) {
230+ if !SCSigMatchSilentErrorEnabled ( de, DETECT_SSH_HASSH ) {
231+ SCLogError ! ( "hassh support is not enabled" ) ;
232+ }
233+ return -2 ;
234+ }
235+ return 0 ;
236+ }
237+
238+ unsafe extern "C" fn ssh_hassh_server_setup (
239+ de : * mut DetectEngineCtx , s : * mut Signature , _raw : * const std:: os:: raw:: c_char ,
240+ ) -> c_int {
241+ if SCDetectSignatureSetAppProto ( s, ALPROTO_SSH ) != 0 {
242+ return -1 ;
243+ }
244+ if SCDetectBufferSetActiveList ( de, s, G_SSH_HASSH_SRV_BUFFER_ID ) < 0 {
245+ return -1 ;
246+ }
247+ /* try to enable Hassh */
248+ SCSshEnableHassh ( ) ;
249+
250+ /* Check if Hassh is disabled */
251+ if !SCSshHasshIsEnabled ( ) {
252+ if !SCSigMatchSilentErrorEnabled ( de, DETECT_SSH_HASSH_SERVER ) {
253+ SCLogError ! ( "hassh support is not enabled" ) ;
254+ }
255+ return -2 ;
256+ }
257+ return 0 ;
258+ }
259+
215260unsafe extern "C" fn ssh_software_obsolete_setup (
216261 _de : * mut DetectEngineCtx , _s : * mut Signature , _raw : * const std:: os:: raw:: c_char ,
217262) -> c_int {
@@ -230,9 +275,13 @@ static mut G_SSH_SOFTWARE_BUFFER_ID: c_int = 0;
230275static mut G_SSH_PROTO_BUFFER_ID : c_int = 0 ;
231276static mut G_SSH_HASSH_STR_BUFFER_ID : c_int = 0 ;
232277static mut G_SSH_HASSH_SRV_STR_BUFFER_ID : c_int = 0 ;
278+ static mut G_SSH_HASSH_BUFFER_ID : c_int = 0 ;
279+ static mut G_SSH_HASSH_SRV_BUFFER_ID : c_int = 0 ;
233280
234281static mut DETECT_SSH_HASSH_STRING : u16 = 0 ;
235282static mut DETECT_SSH_HASSH_SERVER_STRING : u16 = 0 ;
283+ static mut DETECT_SSH_HASSH : u16 = 0 ;
284+ static mut DETECT_SSH_HASSH_SERVER : u16 = 0 ;
236285
237286#[ no_mangle]
238287pub unsafe extern "C" fn SCDetectSshRegister ( ) {
@@ -337,4 +386,46 @@ pub unsafe extern "C" fn SCDetectSshRegister() {
337386 DETECT_SSH_HASSH_SERVER_STRING ,
338387 b"ssh-hassh-server-string\0 " . as_ptr ( ) as * const libc:: c_char ,
339388 ) ;
389+
390+ let kw = SigTableElmtStickyBuffer {
391+ name : String :: from ( "ssh.hassh" ) ,
392+ desc : String :: from ( "ssh.hassh sticky buffer" ) ,
393+ url : String :: from ( "/rules/ssh-keywords.html#hassh" ) ,
394+ setup : ssh_hassh_setup,
395+ } ;
396+ DETECT_SSH_HASSH = helper_keyword_register_sticky_buffer ( & kw) ;
397+ G_SSH_HASSH_BUFFER_ID = SCDetectHelperBufferProgressMpmRegister (
398+ b"ssh.hassh\0 " . as_ptr ( ) as * const libc:: c_char ,
399+ b"Ssh Client Fingerprinting For Ssh Clients\0 " . as_ptr ( ) as * const libc:: c_char ,
400+ ALPROTO_SSH ,
401+ STREAM_TOSERVER ,
402+ Some ( SCSshTxGetHassh ) ,
403+ SSHConnectionState :: SshStateBannerDone as c_int ,
404+ ) ;
405+ SCDetectHelperKeywordAliasRegister (
406+ DETECT_SSH_HASSH ,
407+ b"ssh-hassh\0 " . as_ptr ( ) as * const libc:: c_char ,
408+ ) ;
409+ SCDetectRegisterBufferLowerMd5Callbacks ( b"ssh.hassh\0 " . as_ptr ( ) as * const libc:: c_char ) ;
410+
411+ let kw = SigTableElmtStickyBuffer {
412+ name : String :: from ( "ssh.hassh.server" ) ,
413+ desc : String :: from ( "ssh.hassh.server sticky buffer" ) ,
414+ url : String :: from ( "/rules/ssh-keywords.html#ssh.hassh.server" ) ,
415+ setup : ssh_hassh_server_setup,
416+ } ;
417+ DETECT_SSH_HASSH_SERVER = helper_keyword_register_sticky_buffer ( & kw) ;
418+ G_SSH_HASSH_SRV_BUFFER_ID = SCDetectHelperBufferProgressMpmRegister (
419+ b"ssh.hassh.server\0 " . as_ptr ( ) as * const libc:: c_char ,
420+ b"Ssh Client Fingerprinting For Ssh Servers\0 " . as_ptr ( ) as * const libc:: c_char ,
421+ ALPROTO_SSH ,
422+ STREAM_TOCLIENT ,
423+ Some ( SCSshTxGetHassh ) ,
424+ SSHConnectionState :: SshStateBannerDone as c_int ,
425+ ) ;
426+ SCDetectHelperKeywordAliasRegister (
427+ DETECT_SSH_HASSH_SERVER ,
428+ b"ssh-hassh-server\0 " . as_ptr ( ) as * const libc:: c_char ,
429+ ) ;
430+ SCDetectRegisterBufferLowerMd5Callbacks ( b"ssh.hassh.server\0 " . as_ptr ( ) as * const libc:: c_char ) ;
340431}
0 commit comments