|
| 1 | +# Code Integrity |
| 2 | + |
| 3 | +<!--introduced_in=REPLACEME--> |
| 4 | + |
| 5 | +<!-- type=misc --> |
| 6 | + |
| 7 | +> Stability: 1.1 - Active development |
| 8 | +
|
| 9 | +This feature is only available on Windows platforms. |
| 10 | + |
| 11 | +Code integrity refers to the assurance that software code has not been |
| 12 | +altered or tampered with in any unauthorized way. It ensures that |
| 13 | +the code running on a system is exactly what was intended by the developers. |
| 14 | + |
| 15 | +Code integrity in Node.js integrates with platform features for code integrity |
| 16 | +policy enforcement. See platform speficic sections below for more information. |
| 17 | + |
| 18 | +The Node.js threat model considers the code that the runtime executes to be |
| 19 | +trusted. As such, this feature is an additional safety belt, not a strict |
| 20 | +security boundary. |
| 21 | + |
| 22 | +If you find a potential security vulnerability, please refer to our |
| 23 | +[Security Policy][]. |
| 24 | + |
| 25 | +## Code Integrity on Windows |
| 26 | + |
| 27 | +Code integrity is an opt-in feature that leverages Window Defender Application Control |
| 28 | +to verify the code executing conforms to system policy and has not been modified since |
| 29 | +signing time. |
| 30 | + |
| 31 | +There are three audiences that are involved when using Node.js in an |
| 32 | +environment enforcing code integrity: the application developers, |
| 33 | +those administrating the system enforcing code integrity, and |
| 34 | +the end user. The following sections describe how each audience |
| 35 | +can interact with code integrity enforcement. |
| 36 | + |
| 37 | +### Windows Code Integrity and Application Developers |
| 38 | + |
| 39 | +Windows Defender Application Control uses digital signatures to verify |
| 40 | +a file's integrity. Application developers are responsible for generating and |
| 41 | +distributing the signature information for their Node.js application. |
| 42 | +Application developers are also expected to design their application |
| 43 | +in robust ways to avoid unintended code execution. This includes |
| 44 | +avoiding the use of `eval` and avoiding loading modules outside |
| 45 | +of standard methods. |
| 46 | + |
| 47 | +Signature information for files which Node.js is intended to execute |
| 48 | +can be stored in a catalog file. Application developers can generate |
| 49 | +a Windows catalog file to store the hash of all files Node.js |
| 50 | +is expected to execute. |
| 51 | + |
| 52 | +A catalog can be generated using the `New-FileCatalog` Powershell |
| 53 | +cmdlet. For example |
| 54 | + |
| 55 | +```powershell |
| 56 | +New-FileCatalog -Version 2 -CatalogFilePath MyApplicationCatalog.cat -Path \my\application\path\ |
| 57 | +``` |
| 58 | + |
| 59 | +The `Path` argument should point to the root folder containing your application's code. If |
| 60 | +your application's code is fully contained in one file, `Path` can point to that single file. |
| 61 | + |
| 62 | +Be sure that the catalog is generated using the final version of the files that you intend to ship |
| 63 | +(i.e. after minifying). |
| 64 | + |
| 65 | +The application developer should then sign the generated catalog with their Code Signing certificate |
| 66 | +to ensure the catalog is not tampered with between distribution and execution. |
| 67 | + |
| 68 | +This can be done with the [Set-AuthenticodeSignature commandlet][]. |
| 69 | + |
| 70 | +### Windows Code Integrity and System Administrators |
| 71 | + |
| 72 | +This section is intended for system administrators who want to enable Node.js |
| 73 | +code integrity features in their environments. |
| 74 | + |
| 75 | +This section assumes familiarity with managing WDAC polcies. |
| 76 | +[Official documentation for WDAC][]. |
| 77 | + |
| 78 | +Code integrity enforcement on Windows has two toggleable settings: |
| 79 | +`EnforceCodeIntegrity` and `DisableInteractiveMode`. These settings are configured |
| 80 | +by WDAC policy. |
| 81 | + |
| 82 | +`EnforceCodeIntegrity` causes Node.js to call WldpCanExecuteFile whenever a module is loaded using `require`. |
| 83 | +WldpCanExecuteFile verifies that the file's integrity has not been tampered with from signing time. |
| 84 | +The system administrator should sign and install the application's file catalog where the application |
| 85 | +is running, per WDAC guidance. |
| 86 | + |
| 87 | +`DisableInteractiveMode` prevents Node.js from being run in interactive mode, and also disables the `-e` and `--eval` |
| 88 | +command line options. |
| 89 | + |
| 90 | +#### Enabling Code Integrity Enforcement |
| 91 | + |
| 92 | +On newer Windows versions (22H2+), the preferred method of configuring application settings is done using |
| 93 | +`AppSettings` in your WDAC Policy. |
| 94 | + |
| 95 | +```text |
| 96 | +<AppSettings> |
| 97 | + <App Manifest="wdac-manifest.xml"> |
| 98 | + <Setting Name="EnforceCodeIntegrity" > |
| 99 | + <Value>True</Value> |
| 100 | + </Setting> |
| 101 | + <Setting Name="DisableInteractiveMode" > |
| 102 | + <Value>True</Value> |
| 103 | + </Setting> |
| 104 | + </App> |
| 105 | +</AppSettings> |
| 106 | +``` |
| 107 | + |
| 108 | +On older Windows versions, use the `Settings` section of your WDAC Policy. |
| 109 | + |
| 110 | +```text |
| 111 | +<Settings> |
| 112 | + <Setting Provider="Node.js" Key="Settings" ValueName="EnforceCodeIntegrity"> |
| 113 | + <Value> |
| 114 | + <Boolean>true</Boolean> |
| 115 | + </Value> |
| 116 | + </Setting> |
| 117 | + <Setting Provider="Node.js" Key="Settings" ValueName="DisableInteractiveMode"> |
| 118 | + <Value> |
| 119 | + <Boolean>true</Boolean> |
| 120 | + </Value> |
| 121 | + </Setting> |
| 122 | +</Settings> |
| 123 | +``` |
| 124 | + |
| 125 | +## Code Integrity on Linux |
| 126 | + |
| 127 | +Code integrity on Linux is not yet implemented. Plans for implementation will |
| 128 | +be made once the necessary APIs on Linux have been upstreamed. More information |
| 129 | +can be found here: <https://github.com/nodejs/security-wg/issues/1388> |
| 130 | + |
| 131 | +## Code Integrity on MacOS |
| 132 | + |
| 133 | +Code integrity on MacOS is not yet implemented. Currently, there is no |
| 134 | +timeline for implementation. |
| 135 | + |
| 136 | +[Official documentation for WDAC]: https://learn.microsoft.com/en-us/windows/security/application-security/application-control/windows-defender-application-control/ |
| 137 | +[Security Policy]: https://github.com/nodejs/node/blob/main/SECURITY.md |
| 138 | +[Set-AuthenticodeSignature commandlet]: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-authenticodesignature |
0 commit comments