Skip to content

Commit 1c0bf1b

Browse files
committed
Merge branch 'main' of github.com:AikidoSec/node-RASP into poc-required-pkg
* 'main' of github.com:AikidoSec/node-RASP: (97 commits) Improve comment Improve comment Add extra comments Add missing apispec property for routes Let all benchmarks run even if one fails Pass `t` in function Format Add test case for use case Revert "Add more test cases" Add more test cases Speed up safeDecodeURIComponent unit tests Allow access to route if exact match does Rename variable to make it more clear Remove redundant methods Improve comment Remove `isMonitoredIPAddress` Use userAgent variable Iterate through monitored IP lists only once Add comment about empty string and regexp Refactor safeCreateRegExp to its own file ...
2 parents ba5d502 + 2ce642a commit 1c0bf1b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

69 files changed

+1888
-156
lines changed

.github/workflows/benchmark.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ jobs:
2323
- "27016:5432"
2424
timeout-minutes: 10
2525
strategy:
26+
fail-fast: false
2627
matrix:
2728
node-version: [20.x, 24.x]
2829
steps:

end2end/server/src/handlers/lists.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ const {
22
getBlockedIPAddresses,
33
getBlockedUserAgents,
44
getAllowedIPAddresses,
5+
getMonitoredUserAgents,
6+
getMonitoredIPAddresses,
7+
getUserAgentDetails,
58
} = require("../zen/config");
69

710
module.exports = function lists(req, res) {
@@ -12,6 +15,9 @@ module.exports = function lists(req, res) {
1215
const blockedIps = getBlockedIPAddresses(req.app);
1316
const blockedUserAgents = getBlockedUserAgents(req.app);
1417
const allowedIps = getAllowedIPAddresses(req.app);
18+
const monitoredUserAgents = getMonitoredUserAgents(req.app);
19+
const monitoredIps = getMonitoredIPAddresses(req.app);
20+
const userAgentDetails = getUserAgentDetails(req.app);
1521

1622
res.json({
1723
success: true,
@@ -20,22 +26,37 @@ module.exports = function lists(req, res) {
2026
blockedIps.length > 0
2127
? [
2228
{
29+
key: "geoip/Belgium;BE",
2330
source: "geoip",
2431
description: "geo restrictions",
2532
ips: blockedIps,
2633
},
2734
]
2835
: [],
2936
blockedUserAgents: blockedUserAgents,
37+
monitoredUserAgents: monitoredUserAgents,
38+
userAgentDetails: userAgentDetails,
3039
allowedIPAddresses:
3140
allowedIps.length > 0
3241
? [
3342
{
43+
key: "geoip/Belgium;BE",
3444
source: "geoip",
3545
description: "geo restrictions",
3646
ips: allowedIps,
3747
},
3848
]
3949
: [],
50+
monitoredIPAddresses:
51+
monitoredIps.length > 0
52+
? monitoredIps
53+
: [
54+
{
55+
key: "geoip/Belgium;BE",
56+
source: "geoip",
57+
description: "geo restrictions",
58+
ips: monitoredIps,
59+
},
60+
],
4061
});
4162
};

end2end/server/src/handlers/updateLists.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ const {
22
updateBlockedIPAddresses,
33
updateBlockedUserAgents,
44
updateAllowedIPAddresses,
5+
updateMonitoredUserAgents,
6+
updateMonitoredIPAddresses,
7+
updateUserAgentDetails,
58
} = require("../zen/config");
69

710
module.exports = function updateIPLists(req, res) {
@@ -46,5 +49,26 @@ module.exports = function updateIPLists(req, res) {
4649
updateAllowedIPAddresses(req.app, req.body.allowedIPAddresses);
4750
}
4851

52+
if (
53+
req.body.monitoredUserAgents &&
54+
typeof req.body.monitoredUserAgents === "string"
55+
) {
56+
updateMonitoredUserAgents(req.app, req.body.monitoredUserAgents);
57+
}
58+
59+
if (
60+
req.body.monitoredIPAddresses &&
61+
Array.isArray(req.body.monitoredIPAddresses)
62+
) {
63+
updateMonitoredIPAddresses(req.app, req.body.monitoredIPAddresses);
64+
}
65+
66+
if (
67+
req.body.userAgentDetails &&
68+
Array.isArray(req.body.userAgentDetails)
69+
) {
70+
updateUserAgentDetails(req.app, req.body.userAgentDetails);
71+
}
72+
4973
res.json({ success: true });
5074
};

end2end/server/src/zen/config.js

Lines changed: 83 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ function updateAppConfig(app, newConfig) {
4040
const blockedIPAddresses = [];
4141
const blockedUserAgents = [];
4242
const allowedIPAddresses = [];
43+
const monitoredUserAgents = [];
44+
const monitoredIPAddresses = [];
45+
const userAgentDetails = [];
4346

4447
function updateBlockedIPAddresses(app, ips) {
4548
let entry = blockedIPAddresses.find((ip) => ip.serviceId === app.serviceId);
@@ -90,7 +93,7 @@ function getAllowedIPAddresses(app) {
9093
}
9194

9295
function updateBlockedUserAgents(app, uas) {
93-
let entry = blockedUserAgents.find((e) => e.serviceId === e.serviceId);
96+
let entry = blockedUserAgents.find((e) => e.serviceId === app.serviceId);
9497

9598
if (entry) {
9699
entry.userAgents = uas;
@@ -104,7 +107,7 @@ function updateBlockedUserAgents(app, uas) {
104107
}
105108

106109
function getBlockedUserAgents(app) {
107-
const entry = blockedUserAgents.find((e) => e.serviceId === e.serviceId);
110+
const entry = blockedUserAgents.find((e) => e.serviceId === app.serviceId);
108111

109112
if (entry) {
110113
return entry.userAgents;
@@ -113,6 +116,78 @@ function getBlockedUserAgents(app) {
113116
return "";
114117
}
115118

119+
function updateMonitoredUserAgents(app, uas) {
120+
let entry = monitoredUserAgents.find((e) => e.serviceId === app.serviceId);
121+
122+
if (entry) {
123+
entry.userAgents = uas;
124+
} else {
125+
entry = { serviceId: app.serviceId, userAgents: uas };
126+
monitoredUserAgents.push(entry);
127+
}
128+
129+
// Bump lastUpdatedAt
130+
updateAppConfig(app, {});
131+
}
132+
133+
function getMonitoredUserAgents(app) {
134+
const entry = monitoredUserAgents.find((e) => e.serviceId === app.serviceId);
135+
136+
if (entry) {
137+
return entry.userAgents;
138+
}
139+
140+
return "";
141+
}
142+
143+
function updateMonitoredIPAddresses(app, ips) {
144+
let entry = monitoredIPAddresses.find((e) => e.serviceId === app.serviceId);
145+
146+
if (entry) {
147+
entry.ipAddresses = ips;
148+
} else {
149+
entry = { serviceId: app.serviceId, ipAddresses: ips };
150+
monitoredIPAddresses.push(entry);
151+
}
152+
153+
// Bump lastUpdatedAt
154+
updateAppConfig(app, {});
155+
}
156+
157+
function getMonitoredIPAddresses(app) {
158+
const entry = monitoredIPAddresses.find((e) => e.serviceId === app.serviceId);
159+
160+
if (entry) {
161+
return entry.ipAddresses;
162+
}
163+
164+
return [];
165+
}
166+
167+
function updateUserAgentDetails(app, uas) {
168+
let entry = userAgentDetails.find((e) => e.serviceId === app.serviceId);
169+
170+
if (entry) {
171+
entry.userAgents = uas;
172+
} else {
173+
entry = { serviceId: app.serviceId, userAgents: uas };
174+
userAgentDetails.push(entry);
175+
}
176+
177+
// Bump lastUpdatedAt
178+
updateAppConfig(app, {});
179+
}
180+
181+
function getUserAgentDetails(app) {
182+
const entry = userAgentDetails.find((e) => e.serviceId === app.serviceId);
183+
184+
if (entry) {
185+
return entry.userAgents;
186+
}
187+
188+
return [];
189+
}
190+
116191
module.exports = {
117192
getAppConfig,
118193
updateAppConfig,
@@ -122,4 +197,10 @@ module.exports = {
122197
getBlockedUserAgents,
123198
getAllowedIPAddresses,
124199
updateAllowedIPAddresses,
200+
updateMonitoredUserAgents,
201+
getMonitoredUserAgents,
202+
updateMonitoredIPAddresses,
203+
getMonitoredIPAddresses,
204+
updateUserAgentDetails,
205+
getUserAgentDetails,
125206
};

end2end/tests/hono-xml-allowlists.test.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,24 @@ t.beforeEach(async () => {
3232
enabled: false,
3333
},
3434
},
35+
{
36+
route: "/admin/*",
37+
method: "GET",
38+
forceProtectionOff: false,
39+
allowedIPAddresses: ["10.0.0.1/16"],
40+
rateLimiting: {
41+
enabled: false,
42+
},
43+
},
44+
{
45+
route: "/admin/public",
46+
method: "GET",
47+
forceProtectionOff: false,
48+
allowedIPAddresses: ["0.0.0.0/0", "::/0"],
49+
rateLimiting: {
50+
enabled: false,
51+
},
52+
},
3553
],
3654
}),
3755
});
@@ -150,6 +168,22 @@ t.test("it blocks non-allowed IP addresses", (t) => {
150168
signal: AbortSignal.timeout(5000),
151169
});
152170
t.same(resp6.status, 403);
171+
172+
const resp7 = await fetch("http://127.0.0.1:4002/admin/public", {
173+
headers: {
174+
"X-Forwarded-For": "5.6.7.8",
175+
},
176+
signal: AbortSignal.timeout(5000),
177+
});
178+
t.same(resp7.status, 200);
179+
180+
const resp8 = await fetch("http://127.0.0.1:4002/admin/private", {
181+
headers: {
182+
"X-Forwarded-For": "5.6.7.8",
183+
},
184+
signal: AbortSignal.timeout(5000),
185+
});
186+
t.same(resp8.status, 403);
153187
})
154188
.catch((error) => {
155189
t.fail(error);

0 commit comments

Comments
 (0)