@newrelic/security-agent 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/THIRD_PARTY_NOTICES.md +17 -28
- package/lib/instrumentation-security/core/constants.js +0 -1
- package/lib/instrumentation-security/hooks/fs/nr-fs.js +6 -5
- package/lib/instrumentation-security/hooks/http/nr-http.js +2 -2
- package/lib/instrumentation-security/hooks/mysql/nr-mysql.js +16 -0
- package/lib/instrumentation-security/hooks/native/nr-childProcess.js +1 -1
- package/lib/instrumentation-security/hooks/require/nr-require.js +12 -5
- package/lib/nr-security-agent/lib/core/Auth-headers.js +1 -0
- package/lib/nr-security-agent/lib/core/applicationinfo.js +1 -1
- package/lib/nr-security-agent/lib/core/commonUtils.js +12 -12
- package/lib/nr-security-agent/lib/core/connections/websocket/index.js +0 -6
- package/lib/nr-security-agent/lib/core/connections/websocket/response/IASTUtils.js +50 -0
- package/lib/nr-security-agent/lib/core/connections/websocket/response/collector-policy-handler.js +4 -1
- package/lib/nr-security-agent/lib/core/connections/websocket/response/fuzz-request-handler.js +90 -31
- package/lib/nr-security-agent/lib/core/connections/websocket/response/iast-cool-down.js +15 -0
- package/lib/nr-security-agent/lib/core/connections/websocket/response/iast-record-deletion.js +19 -0
- package/lib/nr-security-agent/lib/core/connections/websocket/response/index.js +17 -5
- package/lib/nr-security-agent/lib/core/connections/websocket/websocket.js +23 -61
- package/lib/nr-security-agent/lib/core/logging.js +89 -71
- package/lib/nr-security-agent/lib/core/sec-agent-constants.js +3 -2
- package/lib/nr-security-agent/lib/core/statusUtils.js +1 -1
- package/lib/nr-security-agent/lib/core/websocket-client.js +5 -168
- package/lib/nr-security-agent/lib/core/xss-utils.js +2 -3
- package/lib/nr-security-agent/resources/config.js +2 -2
- package/package.json +11 -11
- package/lib/nr-security-agent/lib/core/worker-entities.js +0 -82
- package/lib/nr-security-agent/lib/core/worker.js +0 -148
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright 2023 New Relic Corporation. All rights reserved.
|
|
3
|
-
* SPDX-License-Identifier: New Relic Pre-Release
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
// Access the workerData by requiring it.
|
|
7
|
-
const { parentPort, workerData } = require('worker_threads');
|
|
8
|
-
// we need to initialize logger first hand
|
|
9
|
-
const logs = require('./logging');
|
|
10
|
-
const { applicationInfo } = workerData;
|
|
11
|
-
const logger = logs.getLogger(applicationInfo.applicationUUID);
|
|
12
|
-
|
|
13
|
-
const { SecWebSocket, WSCallbacks, releaseWebSocket } = require('./connections/websocket');
|
|
14
|
-
const {
|
|
15
|
-
SetDefaultLogLevelHandler,
|
|
16
|
-
FuzzRequestHandler,
|
|
17
|
-
setLogger: setResponseHandlerLogger
|
|
18
|
-
} = require('./connections/websocket/response');
|
|
19
|
-
const { SERVER_COMMAND } = require('./sec-agent-constants');
|
|
20
|
-
const { WorkerMessage, WORKER_STATUS } = require('./worker-entities');
|
|
21
|
-
const { Agent } = require('./agent');
|
|
22
|
-
const statusUtils = require('./statusUtils');
|
|
23
|
-
const commonUtils = require('./commonUtils');
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const MESSAGE = 'message';
|
|
27
|
-
|
|
28
|
-
const flushInitiatedMsg = new WorkerMessage(WorkerMessage.TYPE.FLUSH, { status: 'initiated' });
|
|
29
|
-
const flushFinishedMsg = new WorkerMessage(WorkerMessage.TYPE.FLUSH, { status: 'flushed' });
|
|
30
|
-
|
|
31
|
-
let connection;
|
|
32
|
-
// we would want to provide a custome on data
|
|
33
|
-
// handler as the some control comands might
|
|
34
|
-
// need change in current thread, and main thread
|
|
35
|
-
// as well.
|
|
36
|
-
const webSocketCallbacks = new WSCallbacks(null, function (data) {
|
|
37
|
-
try {
|
|
38
|
-
const json = JSON.parse(data);
|
|
39
|
-
if (!json.controlCommand) {
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
// we need some updates in worker threads also
|
|
43
|
-
switch (json.controlCommand) {
|
|
44
|
-
case SERVER_COMMAND.SET_DEFAULT_LOG_LEVEL:
|
|
45
|
-
SetDefaultLogLevelHandler(json);
|
|
46
|
-
break;
|
|
47
|
-
case SERVER_COMMAND.FUZZ_REQUEST:
|
|
48
|
-
FuzzRequestHandler.handler(json);
|
|
49
|
-
// we would not want this to be duplicated
|
|
50
|
-
// in main thread, so we would return from here
|
|
51
|
-
return;
|
|
52
|
-
default:
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// send the message to parent in non-blocking mode
|
|
56
|
-
setImmediate(function () {
|
|
57
|
-
parentPort.postMessage(new WorkerMessage(WorkerMessage.TYPE.MESSAGE, json));
|
|
58
|
-
});
|
|
59
|
-
} catch (err) {
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
}, null);
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* This would initiate the worker and bootstrap
|
|
66
|
-
* all the necessary configurations.
|
|
67
|
-
*/
|
|
68
|
-
function initWorker () {
|
|
69
|
-
Agent.init(applicationInfo, logger, null, null);
|
|
70
|
-
setResponseHandlerLogger(logger);
|
|
71
|
-
logger.info('Creating websocket connection in worker thread');
|
|
72
|
-
const validatorService = commonUtils.getValidatorServiceEndpointURL();
|
|
73
|
-
connection = new SecWebSocket(validatorService, webSocketCallbacks, logger);
|
|
74
|
-
Agent.getAgent().setClient(connection);
|
|
75
|
-
// Main thread will pass the data you need
|
|
76
|
-
// through this event listener.
|
|
77
|
-
parentPort.on(MESSAGE, handleMessage);
|
|
78
|
-
// we would set the worker as initialized here
|
|
79
|
-
process.env.WS_WORKER_STATUS = WORKER_STATUS.RUNNING;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Makes the event queue flush
|
|
84
|
-
* when the websocket is initialized in
|
|
85
|
-
* worker, using the connection instance.
|
|
86
|
-
* This also triggers events to main to mark
|
|
87
|
-
* the flushing initiated or complete
|
|
88
|
-
*/
|
|
89
|
-
async function flushEventQueueFromWorker () {
|
|
90
|
-
parentPort.postMessage(flushInitiatedMsg);
|
|
91
|
-
await connection.flushEventQueue();
|
|
92
|
-
parentPort.postMessage(flushFinishedMsg);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* This handles any messages received from main
|
|
97
|
-
* if websocket worker is initialized
|
|
98
|
-
*
|
|
99
|
-
* @param {JSON} msg
|
|
100
|
-
*/
|
|
101
|
-
function handleMessage (msg) {
|
|
102
|
-
const workerMsg = WorkerMessage.parseFromObject(msg);
|
|
103
|
-
if (logger.level && (logger.level.levelStr !== process.env.loglevel)) {
|
|
104
|
-
logger.level = process.env.loglevel;
|
|
105
|
-
}
|
|
106
|
-
switch (workerMsg.getType()) {
|
|
107
|
-
case WorkerMessage.TYPE.MESSAGE: {
|
|
108
|
-
connection.dispatch(workerMsg.getPayload());
|
|
109
|
-
releaseWebSocket();
|
|
110
|
-
break;
|
|
111
|
-
}
|
|
112
|
-
case WorkerMessage.TYPE.FLUSH: {
|
|
113
|
-
flushEventQueueFromWorker();
|
|
114
|
-
break;
|
|
115
|
-
}
|
|
116
|
-
case WorkerMessage.TYPE.UPDATE_APPLICATION_INFO:
|
|
117
|
-
Agent.getAgent().setApplicationInfo(workerMsg.getPayload());
|
|
118
|
-
break;
|
|
119
|
-
case WorkerMessage.TYPE.RECONNECT: {
|
|
120
|
-
connection.reconnect();
|
|
121
|
-
break;
|
|
122
|
-
}
|
|
123
|
-
case WorkerMessage.TYPE.OBEY_RECONNECT: {
|
|
124
|
-
connection.obeyReconnect();
|
|
125
|
-
break;
|
|
126
|
-
}
|
|
127
|
-
default:
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
setInterval(() => {
|
|
132
|
-
try {
|
|
133
|
-
const buffErrors = statusUtils.getRingBufferedErrors();
|
|
134
|
-
while (!buffErrors.isEmpty()) {
|
|
135
|
-
const err = buffErrors.deq();
|
|
136
|
-
parentPort.postMessage(new WorkerMessage(WorkerMessage.TYPE.ERROR, err));
|
|
137
|
-
}
|
|
138
|
-
} catch (error) {
|
|
139
|
-
}
|
|
140
|
-
}, 240000);
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* This would initiate the worker when the
|
|
144
|
-
* module is loaded.
|
|
145
|
-
*/
|
|
146
|
-
(() => {
|
|
147
|
-
initWorker();
|
|
148
|
-
})();
|