@@ -21,7 +21,7 @@ class WriteAccessCheckMacro extends Macro {
2121 VariableAccess va ;
2222
2323 WriteAccessCheckMacro ( ) {
24- this .getName ( ) = [ "user_write_access_begin" , "user_access_begin" ] and
24+ this .getName ( ) = [ "user_write_access_begin" , "user_access_begin" , "access_ok" ] and
2525 va .getEnclosingElement ( ) = this .getAnInvocation ( ) .getAnExpandedElement ( )
2626 }
2727
@@ -37,7 +37,8 @@ class UnSafePutUserMacro extends Macro {
3737 }
3838
3939 Expr getUserModePtr ( ) {
40- result = writeUserPtr .getOperand ( ) .( AddressOfExpr ) .getOperand ( ) .( FieldAccess ) .getQualifier ( )
40+ result = writeUserPtr .getOperand ( ) .( AddressOfExpr ) .getOperand ( ) .( FieldAccess ) .getQualifier ( ) or
41+ result = writeUserPtr .getOperand ( )
4142 }
4243}
4344
@@ -46,11 +47,13 @@ class ExploitableUserModePtrParam extends Parameter {
4647 not exists ( WriteAccessCheckMacro writeAccessCheck |
4748 DataFlow:: localFlow ( DataFlow:: parameterNode ( this ) ,
4849 DataFlow:: exprNode ( writeAccessCheck .getArgument ( ) ) )
50+ ) and
51+ exists ( UnSafePutUserMacro unsafePutUser |
52+ DataFlow:: localFlow ( DataFlow:: parameterNode ( this ) ,
53+ DataFlow:: exprNode ( unsafePutUser .getUserModePtr ( ) ) )
4954 )
5055 }
5156}
5257
53- from ExploitableUserModePtrParam p , UnSafePutUserMacro unsafePutUser
54- where
55- DataFlow:: localFlow ( DataFlow:: parameterNode ( p ) , DataFlow:: exprNode ( unsafePutUser .getUserModePtr ( ) ) )
58+ from ExploitableUserModePtrParam p
5659select p , "unsafe_put_user write user-mode pointer $@ without check." , p , p .toString ( )
0 commit comments