@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.
Files changed (28) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/THIRD_PARTY_NOTICES.md +17 -28
  3. package/lib/instrumentation-security/core/constants.js +0 -1
  4. package/lib/instrumentation-security/hooks/fs/nr-fs.js +6 -5
  5. package/lib/instrumentation-security/hooks/http/nr-http.js +2 -2
  6. package/lib/instrumentation-security/hooks/mysql/nr-mysql.js +16 -0
  7. package/lib/instrumentation-security/hooks/native/nr-childProcess.js +1 -1
  8. package/lib/instrumentation-security/hooks/require/nr-require.js +12 -5
  9. package/lib/nr-security-agent/lib/core/Auth-headers.js +1 -0
  10. package/lib/nr-security-agent/lib/core/applicationinfo.js +1 -1
  11. package/lib/nr-security-agent/lib/core/commonUtils.js +12 -12
  12. package/lib/nr-security-agent/lib/core/connections/websocket/index.js +0 -6
  13. package/lib/nr-security-agent/lib/core/connections/websocket/response/IASTUtils.js +50 -0
  14. package/lib/nr-security-agent/lib/core/connections/websocket/response/collector-policy-handler.js +4 -1
  15. package/lib/nr-security-agent/lib/core/connections/websocket/response/fuzz-request-handler.js +90 -31
  16. package/lib/nr-security-agent/lib/core/connections/websocket/response/iast-cool-down.js +15 -0
  17. package/lib/nr-security-agent/lib/core/connections/websocket/response/iast-record-deletion.js +19 -0
  18. package/lib/nr-security-agent/lib/core/connections/websocket/response/index.js +17 -5
  19. package/lib/nr-security-agent/lib/core/connections/websocket/websocket.js +23 -61
  20. package/lib/nr-security-agent/lib/core/logging.js +89 -71
  21. package/lib/nr-security-agent/lib/core/sec-agent-constants.js +3 -2
  22. package/lib/nr-security-agent/lib/core/statusUtils.js +1 -1
  23. package/lib/nr-security-agent/lib/core/websocket-client.js +5 -168
  24. package/lib/nr-security-agent/lib/core/xss-utils.js +2 -3
  25. package/lib/nr-security-agent/resources/config.js +2 -2
  26. package/package.json +11 -11
  27. package/lib/nr-security-agent/lib/core/worker-entities.js +0 -82
  28. 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
- })();