Skip to content

Commit 265500f

Browse files
authored
Merge pull request #8800 from geoffw0/unsafeput
C++: Add a test for experimental query NoCheckBeforeUnsafePutUser.ql.
2 parents 3c47159 + 40da7a1 commit 265500f

File tree

3 files changed

+84
-0
lines changed

3 files changed

+84
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
| test.cpp:14:16:14:16 | p | unsafe_put_user write user-mode pointer $@ without check. | test.cpp:14:16:14:16 | p | p |
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
experimental/Security/CWE/CWE-020/NoCheckBeforeUnsafePutUser.ql
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
2+
typedef unsigned long size_t;
3+
4+
void SYSC_SOMESYSTEMCALL(void *param);
5+
6+
bool user_access_begin_impl(const void *where, size_t sz);
7+
void user_access_end_impl();
8+
#define user_access_begin(where, sz) user_access_begin_impl(where, sz)
9+
#define user_access_end() user_access_end_impl()
10+
11+
void unsafe_put_user_impl(int what, const void *where, size_t sz);
12+
#define unsafe_put_user(what, where) unsafe_put_user_impl( (what), (where), sizeof(*(where)) )
13+
14+
void test1(int p)
15+
{
16+
SYSC_SOMESYSTEMCALL(&p);
17+
18+
unsafe_put_user(123, &p); // BAD
19+
}
20+
21+
void test2(int p)
22+
{
23+
SYSC_SOMESYSTEMCALL(&p);
24+
25+
if (user_access_begin(&p, sizeof(p)))
26+
{
27+
unsafe_put_user(123, &p); // GOOD
28+
29+
user_access_end();
30+
}
31+
}
32+
33+
void test3()
34+
{
35+
int v;
36+
37+
SYSC_SOMESYSTEMCALL(&v);
38+
39+
unsafe_put_user(123, &v); // BAD [NOT DETECTED]
40+
}
41+
42+
void test4()
43+
{
44+
int v;
45+
46+
SYSC_SOMESYSTEMCALL(&v);
47+
48+
if (user_access_begin(&v, sizeof(v)))
49+
{
50+
unsafe_put_user(123, &v); // GOOD
51+
52+
user_access_end();
53+
}
54+
}
55+
56+
struct data
57+
{
58+
int x;
59+
};
60+
61+
void test5()
62+
{
63+
data myData;
64+
65+
SYSC_SOMESYSTEMCALL(&myData);
66+
67+
unsafe_put_user(123, &(myData.x)); // BAD [NOT DETECTED]
68+
}
69+
70+
void test6()
71+
{
72+
data myData;
73+
74+
SYSC_SOMESYSTEMCALL(&myData);
75+
76+
if (user_access_begin(&myData, sizeof(myData)))
77+
{
78+
unsafe_put_user(123, &(myData.x)); // GOOD
79+
80+
user_access_end();
81+
}
82+
}

0 commit comments

Comments
 (0)