Skip to content

Commit

Permalink
feat: use timingSafeStringEqual for auth string comparisons
Browse files Browse the repository at this point in the history
  • Loading branch information
kirillgroshkov committed Mar 7, 2024
1 parent 6b48182 commit 036f6d9
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 38 deletions.
4 changes: 3 additions & 1 deletion src/admin/secureHeaderMiddleware.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AppError } from '@naturalcycles/js-lib'
import { timingSafeStringEqual } from '@naturalcycles/nodejs-lib'
import { BackendRequestHandler } from '../server/server.model'
import { AdminMiddleware, RequireAdminCfg, requireAdminPermissions } from './adminMiddleware'
import { BaseAdminService } from './base.admin.service'
Expand Down Expand Up @@ -41,7 +42,8 @@ function requireSecureHeaderOrAdmin(

// Header provided - don't check for Admin
if (providedHeader) {
if (!secureHeaderValue || providedHeader === secureHeaderValue) return next()
if (!secureHeaderValue || timingSafeStringEqual(providedHeader, secureHeaderValue))
return next()

return next(
new AppError('secureHeader or adminToken is required', {
Expand Down
4 changes: 2 additions & 2 deletions src/server/basicAuthMiddleware.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { _split, StringMap } from '@naturalcycles/js-lib'
import { base64ToString } from '@naturalcycles/nodejs-lib'
import { base64ToString, timingSafeStringEqual } from '@naturalcycles/nodejs-lib'
import { BackendRequestHandler } from './server.model'

export interface BasicAuthMiddlewareCfg {
Expand All @@ -21,7 +21,7 @@ export function basicAuthMiddleware(cfg: BasicAuthMiddlewareCfg): BackendRequest
const hash = (req.headers.authorization || '').split(' ')[1]
if (hash) {
const [login, password] = _split(base64ToString(hash), ':', 2)
if (login && password && cfg.loginPasswordMap[login] === password) {
if (login && password && timingSafeStringEqual(cfg.loginPasswordMap[login], password)) {
return next()
}
}
Expand Down
65 changes: 30 additions & 35 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1056,9 +1056,9 @@
zod "^3.20.2"

"@naturalcycles/nodejs-lib@^13.0.1", "@naturalcycles/nodejs-lib@^13.0.2", "@naturalcycles/nodejs-lib@^13.1.0", "@naturalcycles/nodejs-lib@^13.1.1":
version "13.7.2"
resolved "https://registry.yarnpkg.com/@naturalcycles/nodejs-lib/-/nodejs-lib-13.7.2.tgz#de55df6ad980f3ae3c61d4f8e6f9551f1880c4bc"
integrity sha512-aLlYW5mOaUiQzmlxB+bHlHo/iVjrTDYEIV4wrzIAO2xnvADoeZexGj9fLfAEK6g6jvsCQ+AhmVmNDTtsFSEdQA==
version "13.8.0"
resolved "https://registry.yarnpkg.com/@naturalcycles/nodejs-lib/-/nodejs-lib-13.8.0.tgz#caa3cc17b1657c1b4d37075abf31597ffd906231"
integrity sha512-i+a789qPL+47MxUEWn4Lqu6VPKCR98UU4CsBJXpBH7lraEU05kLq3aBEO1oDrgY8Hd8d4G3whhwPkUjiUzaGGg==
dependencies:
"@naturalcycles/js-lib" "^14.0.0"
"@types/js-yaml" "^4.0.9"
Expand Down Expand Up @@ -1430,9 +1430,9 @@
integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==

"@types/node@*", "@types/node@>=12.12.47", "@types/node@>=13.7.0", "@types/node@^20.1.0", "@types/node@^20.10.3":
version "20.11.24"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.24.tgz#cc207511104694e84e9fb17f9a0c4c42d4517792"
integrity sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==
version "20.11.25"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.25.tgz#0f50d62f274e54dd7a49f7704cc16bfbcccaf49f"
integrity sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==
dependencies:
undici-types "~5.26.4"

Expand Down Expand Up @@ -2242,9 +2242,9 @@ camelcase@^6.2.0:
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==

caniuse-lite@^1.0.30001587:
version "1.0.30001594"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001594.tgz#bea552414cd52c2d0c985ed9206314a696e685f5"
integrity sha512-VblSX6nYqyJVs8DKFMldE2IVCJjZ225LW00ydtUWwh5hk9IfkTOffO6r8gJNsH0qqqeAF8KrbMYA2VEwTlGW5g==
version "1.0.30001596"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001596.tgz#da06b79c3d9c3d9958eb307aa832ac68ead79bee"
integrity sha512-zpkZ+kEr6We7w63ORkoJ2pOfBwBkY/bJrG/UZ90qNb45Isblu8wzDgevEOrRL1r9dWayHjYiiyCMEXPn4DweGQ==

chalk@5.3.0, chalk@^5.3.0:
version "5.3.0"
Expand Down Expand Up @@ -2695,14 +2695,14 @@ dotenv@^16.0.0:
integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==

duplexify@^4.0.0:
version "4.1.2"
resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0"
integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==
version "4.1.3"
resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.3.tgz#a07e1c0d0a2c001158563d32592ba58bddb0236f"
integrity sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==
dependencies:
end-of-stream "^1.4.1"
inherits "^2.0.3"
readable-stream "^3.1.1"
stream-shift "^1.0.0"
stream-shift "^1.0.2"

ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11:
version "1.0.11"
Expand All @@ -2724,9 +2724,9 @@ ejs@^3.0.1:
jake "^10.8.5"

electron-to-chromium@^1.4.668:
version "1.4.693"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.693.tgz#001bb5dcb57ba404366ec39e1957d11886fc8a93"
integrity sha512-/if4Ueg0GUQlhCrW2ZlXwDAm40ipuKo+OgeHInlL8sbjt+hzISxZK949fZeJaVsheamrzANXvw1zQTvbxTvSHw==
version "1.4.695"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.695.tgz#1753f4017e8d7e72a1ce5058c0fc66c8b67bab8e"
integrity sha512-eMijZmeqPtm774pCZIOrfUHMs/7ls++W1sLhxwqgu8KQ8E2WmMtzwyqOMt0XXUJ3HTIPfuwlfwF+I5cwnfItBA==

emittery@^0.13.1:
version "0.13.1"
Expand Down Expand Up @@ -2933,9 +2933,9 @@ eslint-plugin-jest@^27.0.1:
"@typescript-eslint/utils" "^5.10.0"

eslint-plugin-jsdoc@^48.0.1:
version "48.2.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.0.tgz#a726fbd6fa286fad8fc14f0a6aca48488d188d95"
integrity sha512-O2B1XLBJnUCRkggFzUQ+PBYJDit8iAgXdlu8ucolqGrbmOWPvttZQZX8d1sC0MbqDMSLs8SHSQxaNPRY1RQREg==
version "48.2.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.1.tgz#9334a05555a95fdc192980627142177963b668b4"
integrity sha512-iUvbcyDZSO/9xSuRv2HQBw++8VkV/pt3UWtX9cpPH0l7GKPq78QC/6+PmyQHHvNZaTjAce6QVciEbnc6J/zH5g==
dependencies:
"@es-joy/jsdoccomment" "~0.42.0"
are-docs-informative "^0.0.2"
Expand Down Expand Up @@ -4585,9 +4585,9 @@ joi@^17.9.2:
"@sideway/pinpoint" "^2.0.0"

jose@^4.14.6:
version "4.15.4"
resolved "https://registry.yarnpkg.com/jose/-/jose-4.15.4.tgz#02a9a763803e3872cf55f29ecef0dfdcc218cc03"
integrity sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==
version "4.15.5"
resolved "https://registry.yarnpkg.com/jose/-/jose-4.15.5.tgz#6475d0f467ecd3c630a1b5dadd2735a7288df706"
integrity sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg==

js-tokens@^4.0.0:
version "4.0.0"
Expand Down Expand Up @@ -4773,12 +4773,12 @@ levn@^0.4.1:
type-check "~0.4.0"

light-my-request@^5.11.0:
version "5.11.1"
resolved "https://registry.yarnpkg.com/light-my-request/-/light-my-request-5.11.1.tgz#9bbb993039ff5ccdcdcff359c39892a3fac9bdcd"
integrity sha512-KXAh2m6VRlkWCk2KfmHE7tLBXKh30JE0tXUJY4dNxje4oLmPKUqlUfImiEQZLphx+Z9KTQcVv4DjGnJxkVOIbA==
version "5.12.0"
resolved "https://registry.yarnpkg.com/light-my-request/-/light-my-request-5.12.0.tgz#e42ed02ddbfa587f82031b21459c6841a6948dfa"
integrity sha512-P526OX6E7aeCIfw/9UyJNsAISfcFETghysaWHQAlQYayynShT08MOj4c6fBCvTWBrHXSvqBAKDp3amUPSCQI4w==
dependencies:
cookie "^0.6.0"
process-warning "^2.0.0"
process-warning "^3.0.0"
set-cookie-parser "^2.4.1"

lilconfig@3.0.0:
Expand Down Expand Up @@ -5577,11 +5577,6 @@ process-nextick-args@~2.0.0:
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==

process-warning@^2.0.0:
version "2.3.2"
resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-2.3.2.tgz#70d8a3251aab0eafe3a595d8ae2c5d2277f096a5"
integrity sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA==

process-warning@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-3.0.0.tgz#96e5b88884187a1dce6f5c3166d611132058710b"
Expand Down Expand Up @@ -6169,7 +6164,7 @@ stream-events@^1.0.5:
dependencies:
stubs "^3.0.0"

stream-shift@^1.0.0:
stream-shift@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b"
integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==
Expand Down Expand Up @@ -6601,9 +6596,9 @@ typed-array-length@^1.0.5:
possible-typed-array-names "^1.0.0"

typescript@^5.0.2:
version "5.3.3"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37"
integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==
version "5.4.2"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.2.tgz#0ae9cebcfae970718474fe0da2c090cad6577372"
integrity sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==

unbox-primitive@^1.0.2:
version "1.0.2"
Expand Down

0 comments on commit 036f6d9

Please sign in to comment.