@@ -21,7 +21,7 @@ class WriteAccessCheckMacro extends Macro {
21
21
VariableAccess va ;
22
22
23
23
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
25
25
va .getEnclosingElement ( ) = this .getAnInvocation ( ) .getAnExpandedElement ( )
26
26
}
27
27
@@ -37,7 +37,8 @@ class UnSafePutUserMacro extends Macro {
37
37
}
38
38
39
39
Expr getUserModePtr ( ) {
40
- result = writeUserPtr .getOperand ( ) .( AddressOfExpr ) .getOperand ( ) .( FieldAccess ) .getQualifier ( )
40
+ result = writeUserPtr .getOperand ( ) .( AddressOfExpr ) .getOperand ( ) .( FieldAccess ) .getQualifier ( ) or
41
+ result = writeUserPtr .getOperand ( )
41
42
}
42
43
}
43
44
@@ -46,11 +47,13 @@ class ExploitableUserModePtrParam extends Parameter {
46
47
not exists ( WriteAccessCheckMacro writeAccessCheck |
47
48
DataFlow:: localFlow ( DataFlow:: parameterNode ( this ) ,
48
49
DataFlow:: exprNode ( writeAccessCheck .getArgument ( ) ) )
50
+ ) and
51
+ exists ( UnSafePutUserMacro unsafePutUser |
52
+ DataFlow:: localFlow ( DataFlow:: parameterNode ( this ) ,
53
+ DataFlow:: exprNode ( unsafePutUser .getUserModePtr ( ) ) )
49
54
)
50
55
}
51
56
}
52
57
53
- from ExploitableUserModePtrParam p , UnSafePutUserMacro unsafePutUser
54
- where
55
- DataFlow:: localFlow ( DataFlow:: parameterNode ( p ) , DataFlow:: exprNode ( unsafePutUser .getUserModePtr ( ) ) )
58
+ from ExploitableUserModePtrParam p
56
59
select p , "unsafe_put_user write user-mode pointer $@ without check." , p , p .toString ( )
0 commit comments