@blamejs/core 0.17.11 → 0.17.13
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 +4 -0
- package/NOTICE +1 -1
- package/index.js +2 -0
- package/lib/app-shutdown.js +23 -20
- package/lib/audit.js +7 -5
- package/lib/content-digest.js +2 -1
- package/lib/crypto.js +252 -8
- package/lib/daemon.js +268 -24
- package/lib/db-declare-view.js +2 -2
- package/lib/db.js +4 -1
- package/lib/dsr.js +1 -1
- package/lib/i18n-messageformat.js +3 -2
- package/lib/log-stream-otlp-grpc.js +5 -1
- package/lib/log-stream-otlp.js +5 -1
- package/lib/log-stream.js +5 -2
- package/lib/middleware/bot-guard.js +5 -9
- package/lib/outbox.js +1 -1
- package/lib/pid-probe.js +55 -0
- package/lib/pqc-agent.js +8 -1
- package/lib/redact.js +54 -0
- package/lib/safe-object.js +80 -0
- package/lib/self-update-standalone-verifier.js +74 -27
- package/lib/self-update.js +497 -87
- package/lib/ssrf-guard.js +52 -0
- package/lib/vendor/MANIFEST.json +11 -11
- package/lib/vendor/public-suffix-list.dat +7 -41
- package/lib/vendor/public-suffix-list.data.js +5269 -5285
- package/lib/watcher.js +89 -17
- package/lib/webhook-dispatcher.js +1 -1
- package/lib/ws-client.js +17 -0
- package/package.json +1 -1
- package/sbom.cdx.json +6 -6
package/lib/ssrf-guard.js
CHANGED
|
@@ -820,6 +820,56 @@ function isPrivate(ip) { return classify(ip) === "private"; }
|
|
|
820
820
|
*/
|
|
821
821
|
function isLoopback(ip) { return classify(ip) === "loopback"; }
|
|
822
822
|
|
|
823
|
+
/**
|
|
824
|
+
* @primitive b.ssrfGuard.isLoopbackHost
|
|
825
|
+
* @signature b.ssrfGuard.isLoopbackHost(host)
|
|
826
|
+
* @since 0.17.13
|
|
827
|
+
* @status stable
|
|
828
|
+
* @related b.ssrfGuard.isExactLoopbackName, b.ssrfGuard.isLoopback, b.ssrfGuard.canonicalizeHost
|
|
829
|
+
*
|
|
830
|
+
* Hostname-aware loopback test. Unlike `isLoopback` (IP literals only) this
|
|
831
|
+
* canonicalizes `host` (strips `[]` brackets + trailing dots, folds an
|
|
832
|
+
* IPv4-mapped IPv6, lowercases) and returns `true` for a loopback IP literal
|
|
833
|
+
* OR the RFC 6761 §6.3 reserved names `localhost` and any `*.localhost`. Pure
|
|
834
|
+
* name-shape — never resolves DNS.
|
|
835
|
+
*
|
|
836
|
+
* @example
|
|
837
|
+
* b.ssrfGuard.isLoopbackHost("localhost"); // → true
|
|
838
|
+
* b.ssrfGuard.isLoopbackHost("[::1]"); // → true
|
|
839
|
+
* b.ssrfGuard.isLoopbackHost("app.localhost"); // → true
|
|
840
|
+
* b.ssrfGuard.isLoopbackHost("example.com"); // → false
|
|
841
|
+
*/
|
|
842
|
+
function isLoopbackHost(host) {
|
|
843
|
+
if (typeof host !== "string" || host.length === 0) return false;
|
|
844
|
+
var canon = canonicalizeHost(host);
|
|
845
|
+
if (net.isIP(canon)) return classify(canon) === "loopback";
|
|
846
|
+
return canon === "localhost" || /\.localhost$/.test(canon);
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
/**
|
|
850
|
+
* @primitive b.ssrfGuard.isExactLoopbackName
|
|
851
|
+
* @signature b.ssrfGuard.isExactLoopbackName(host)
|
|
852
|
+
* @since 0.17.13
|
|
853
|
+
* @status stable
|
|
854
|
+
* @related b.ssrfGuard.isLoopbackHost
|
|
855
|
+
*
|
|
856
|
+
* Like `isLoopbackHost` but WITHOUT the `*.localhost` subdomain reservation —
|
|
857
|
+
* accepts only the exact `localhost` name or a loopback IP literal. For the
|
|
858
|
+
* OAuth/OIDC cleartext-redirect loopback exception (RFC 9700 §4.1.1), which
|
|
859
|
+
* must not widen to a `*.localhost` name an attacker could register in a resolver.
|
|
860
|
+
*
|
|
861
|
+
* @example
|
|
862
|
+
* b.ssrfGuard.isExactLoopbackName("localhost"); // → true
|
|
863
|
+
* b.ssrfGuard.isExactLoopbackName("127.0.0.1"); // → true
|
|
864
|
+
* b.ssrfGuard.isExactLoopbackName("app.localhost"); // → false
|
|
865
|
+
*/
|
|
866
|
+
function isExactLoopbackName(host) {
|
|
867
|
+
if (typeof host !== "string" || host.length === 0) return false;
|
|
868
|
+
var canon = canonicalizeHost(host);
|
|
869
|
+
if (net.isIP(canon)) return classify(canon) === "loopback";
|
|
870
|
+
return canon === "localhost";
|
|
871
|
+
}
|
|
872
|
+
|
|
823
873
|
/**
|
|
824
874
|
* @primitive b.ssrfGuard.isLinkLocal
|
|
825
875
|
* @signature b.ssrfGuard.isLinkLocal(ip)
|
|
@@ -958,6 +1008,8 @@ module.exports = {
|
|
|
958
1008
|
createAllowlist: createAllowlist,
|
|
959
1009
|
isPrivate: isPrivate,
|
|
960
1010
|
isLoopback: isLoopback,
|
|
1011
|
+
isLoopbackHost: isLoopbackHost,
|
|
1012
|
+
isExactLoopbackName: isExactLoopbackName,
|
|
961
1013
|
isLinkLocal: isLinkLocal,
|
|
962
1014
|
isCloudMetadata: isCloudMetadata,
|
|
963
1015
|
isReserved: isReserved,
|
package/lib/vendor/MANIFEST.json
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"hashes": {
|
|
19
19
|
"server": "sha256:2b30a26f728c5349f4c4b47834f862a4f77393b1224fc12b22abe3ce2cfab78f"
|
|
20
20
|
},
|
|
21
|
-
"refreshedAt": "2026-07-
|
|
21
|
+
"refreshedAt": "2026-07-23T17:16:44.262Z"
|
|
22
22
|
},
|
|
23
23
|
"@noble/curves": {
|
|
24
24
|
"version": "2.2.0",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"hashes": {
|
|
41
41
|
"server": "sha256:2880c288b1285ef51d356d057bee6f0c8a00de36638cf47b47617e8c1faf10d5"
|
|
42
42
|
},
|
|
43
|
-
"refreshedAt": "2026-07-
|
|
43
|
+
"refreshedAt": "2026-07-23T17:16:44.262Z"
|
|
44
44
|
},
|
|
45
45
|
"@noble/post-quantum": {
|
|
46
46
|
"version": "0.6.1",
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
"hashes": {
|
|
72
72
|
"server": "sha256:f9c94094b3c10fe73dac5343289da582454ea6053494fab2bf66099d9103d6c3"
|
|
73
73
|
},
|
|
74
|
-
"refreshedAt": "2026-07-
|
|
74
|
+
"refreshedAt": "2026-07-23T17:16:44.262Z"
|
|
75
75
|
},
|
|
76
76
|
"@simplewebauthn/server": {
|
|
77
77
|
"version": "13.3.2",
|
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
"hashes": {
|
|
95
95
|
"server": "sha256:e83195dc9f189385da9c856ef38843f4466f93ea8f3d7fc2efcb1e1b18da6f20"
|
|
96
96
|
},
|
|
97
|
-
"refreshedAt": "2026-07-
|
|
97
|
+
"refreshedAt": "2026-07-23T17:16:44.262Z"
|
|
98
98
|
},
|
|
99
99
|
"SecLists-common-passwords-top-10000": {
|
|
100
100
|
"version": "10k-most-common (master)",
|
|
@@ -114,7 +114,7 @@
|
|
|
114
114
|
},
|
|
115
115
|
"runtime_artifact": "lib/vendor/common-passwords-top-10000.data.js",
|
|
116
116
|
"integrity_layers": "sha256 + sha3-512 + SLH-DSA-SHAKE-256f signature + in-payload canary (where applicable)",
|
|
117
|
-
"refreshedAt": "2026-07-
|
|
117
|
+
"refreshedAt": "2026-07-23T17:16:44.262Z"
|
|
118
118
|
},
|
|
119
119
|
"bimi-trust-anchors": {
|
|
120
120
|
"version": "operator-managed",
|
|
@@ -139,7 +139,7 @@
|
|
|
139
139
|
},
|
|
140
140
|
"runtime_artifact": "lib/vendor/bimi-trust-anchors.data.js",
|
|
141
141
|
"integrity_layers": "sha256 + sha3-512 + SLH-DSA-SHAKE-256f signature + in-payload canary (where applicable)",
|
|
142
|
-
"refreshedAt": "2026-07-
|
|
142
|
+
"refreshedAt": "2026-07-23T17:16:44.262Z"
|
|
143
143
|
},
|
|
144
144
|
"publicsuffix-list": {
|
|
145
145
|
"version": "master",
|
|
@@ -152,14 +152,14 @@
|
|
|
152
152
|
"data_js": "lib/vendor/public-suffix-list.data.js"
|
|
153
153
|
},
|
|
154
154
|
"bundler": "curl https://publicsuffix.org/list/public_suffix_list.dat",
|
|
155
|
-
"bundledAt": "2026-07-
|
|
155
|
+
"bundledAt": "2026-07-23T00:00:00Z",
|
|
156
156
|
"hashes": {
|
|
157
|
-
"server": "sha256:
|
|
158
|
-
"data_js": "sha256:
|
|
157
|
+
"server": "sha256:da358965c19dfbc44ad7fc4ba769203a61e13be67314645e502300c2e52cac21",
|
|
158
|
+
"data_js": "sha256:ce0071657db1097831ccafeb5a282214d2a06dcbab3ae4f4053c60b987223d5b"
|
|
159
159
|
},
|
|
160
160
|
"runtime_artifact": "lib/vendor/public-suffix-list.data.js",
|
|
161
161
|
"integrity_layers": "sha256 + sha3-512 + SLH-DSA-SHAKE-256f signature + in-payload canary (where applicable)",
|
|
162
|
-
"refreshedAt": "2026-07-
|
|
162
|
+
"refreshedAt": "2026-07-23T17:16:44.262Z"
|
|
163
163
|
},
|
|
164
164
|
"peculiar-pki": {
|
|
165
165
|
"version": "2.0.0+pkijs-3.4.0",
|
|
@@ -190,7 +190,7 @@
|
|
|
190
190
|
"hashes": {
|
|
191
191
|
"server": "sha256:2307ef65e070757ffb13442b377e45efb9fa1a10432d9b39618387720ab990ed"
|
|
192
192
|
},
|
|
193
|
-
"refreshedAt": "2026-07-
|
|
193
|
+
"refreshedAt": "2026-07-23T17:16:44.262Z"
|
|
194
194
|
}
|
|
195
195
|
}
|
|
196
196
|
}
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
// Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat,
|
|
6
6
|
// rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported.
|
|
7
7
|
|
|
8
|
-
// VERSION: 2026-07-
|
|
9
|
-
// COMMIT:
|
|
8
|
+
// VERSION: 2026-07-23_05-57-33_UTC
|
|
9
|
+
// COMMIT: 438c5e02a9db7870300cb3108258aeefc8467c36
|
|
10
10
|
|
|
11
11
|
// Instructions on pulling and using this list can be found at https://publicsuffix.org/list/.
|
|
12
12
|
|
|
@@ -1631,7 +1631,6 @@ trentin-sudtirol.it
|
|
|
1631
1631
|
trentin-südtirol.it
|
|
1632
1632
|
trentin-sued-tirol.it
|
|
1633
1633
|
trentin-suedtirol.it
|
|
1634
|
-
trentino.it
|
|
1635
1634
|
trentino-a-adige.it
|
|
1636
1635
|
trentino-aadige.it
|
|
1637
1636
|
trentino-alto-adige.it
|
|
@@ -1652,7 +1651,6 @@ trentinos-tirol.it
|
|
|
1652
1651
|
trentinostirol.it
|
|
1653
1652
|
trentinosud-tirol.it
|
|
1654
1653
|
trentinosüd-tirol.it
|
|
1655
|
-
trentinosudtirol.it
|
|
1656
1654
|
trentinosüdtirol.it
|
|
1657
1655
|
trentinosued-tirol.it
|
|
1658
1656
|
trentinosuedtirol.it
|
|
@@ -1668,7 +1666,6 @@ umbria.it
|
|
|
1668
1666
|
val-d-aosta.it
|
|
1669
1667
|
val-daosta.it
|
|
1670
1668
|
vald-aosta.it
|
|
1671
|
-
valdaosta.it
|
|
1672
1669
|
valle-aosta.it
|
|
1673
1670
|
valle-d-aosta.it
|
|
1674
1671
|
valle-daosta.it
|
|
@@ -1705,7 +1702,6 @@ aosta.it
|
|
|
1705
1702
|
aoste.it
|
|
1706
1703
|
ap.it
|
|
1707
1704
|
aq.it
|
|
1708
|
-
aquila.it
|
|
1709
1705
|
ar.it
|
|
1710
1706
|
arezzo.it
|
|
1711
1707
|
ascoli-piceno.it
|
|
@@ -1929,6 +1925,9 @@ sondrio.it
|
|
|
1929
1925
|
sp.it
|
|
1930
1926
|
sr.it
|
|
1931
1927
|
ss.it
|
|
1928
|
+
su.it
|
|
1929
|
+
sud-sardegna.it
|
|
1930
|
+
sudsardegna.it
|
|
1932
1931
|
südtirol.it
|
|
1933
1932
|
suedtirol.it
|
|
1934
1933
|
sv.it
|
|
@@ -1949,6 +1948,7 @@ trani-barletta-andria.it
|
|
|
1949
1948
|
traniandriabarletta.it
|
|
1950
1949
|
tranibarlettaandria.it
|
|
1951
1950
|
trapani.it
|
|
1951
|
+
trentino.it
|
|
1952
1952
|
trento.it
|
|
1953
1953
|
treviso.it
|
|
1954
1954
|
trieste.it
|
|
@@ -1967,6 +1967,7 @@ ve.it
|
|
|
1967
1967
|
venezia.it
|
|
1968
1968
|
venice.it
|
|
1969
1969
|
verbania.it
|
|
1970
|
+
verbano-cusio-ossola.it
|
|
1970
1971
|
vercelli.it
|
|
1971
1972
|
verona.it
|
|
1972
1973
|
vi.it
|
|
@@ -12576,12 +12577,6 @@ bubbleapps.io
|
|
|
12576
12577
|
// Submitted by Klara Mall <dns@bwcloud-os.de>
|
|
12577
12578
|
*.bwcloud-os-instance.de
|
|
12578
12579
|
|
|
12579
|
-
// Bytemark Hosting : https://www.bytemark.co.uk
|
|
12580
|
-
// Submitted by Paul Cammish <paul.cammish@bytemark.co.uk>
|
|
12581
|
-
uk0.bigv.io
|
|
12582
|
-
dh.bytemark.co.uk
|
|
12583
|
-
vm.bytemark.co.uk
|
|
12584
|
-
|
|
12585
12580
|
// Caf.js Labs LLC : https://www.cafjs.com
|
|
12586
12581
|
// Submitted by Antonio Lain <antlai@cafjs.com>
|
|
12587
12582
|
cafjs.com
|
|
@@ -12841,10 +12836,6 @@ craft.me
|
|
|
12841
12836
|
// Submitted by Ales Krajnik <ales.krajnik@craynic.com>
|
|
12842
12837
|
realm.cz
|
|
12843
12838
|
|
|
12844
|
-
// Cryptonomic : https://cryptonomic.net/
|
|
12845
|
-
// Submitted by Andrew Cady <public-suffix-list@cryptonomic.net>
|
|
12846
|
-
*.cryptonomic.net
|
|
12847
|
-
|
|
12848
12839
|
// cyber_Folks S.A. : https://cyberfolks.pl
|
|
12849
12840
|
// Submitted by Bartlomiej Kida <security@cyberfolks.pl>
|
|
12850
12841
|
cfolks.pl
|
|
@@ -12927,11 +12918,6 @@ deployagent.space
|
|
|
12927
12918
|
// Submitted by Peter Thomassen <peter@desec.io>
|
|
12928
12919
|
dedyn.io
|
|
12929
12920
|
|
|
12930
|
-
// Deta : https://www.deta.sh/
|
|
12931
|
-
// Submitted by Aavash Shrestha <aavash@deta.sh>
|
|
12932
|
-
deta.app
|
|
12933
|
-
deta.dev
|
|
12934
|
-
|
|
12935
12921
|
// Deuxfleurs : https://deuxfleurs.fr
|
|
12936
12922
|
// Submitted by Aeddis Desauw <ca@deuxfleurs.fr>
|
|
12937
12923
|
deuxfleurs.eu
|
|
@@ -13511,10 +13497,6 @@ on.expo.app
|
|
|
13511
13497
|
staging.expo.app
|
|
13512
13498
|
on.staging.expo.app
|
|
13513
13499
|
|
|
13514
|
-
// Fabrica Technologies, Inc. : https://www.fabrica.dev/
|
|
13515
|
-
// Submitted by Eric Jiang <eric@fabrica.dev>
|
|
13516
|
-
onfabrica.com
|
|
13517
|
-
|
|
13518
13500
|
// fachschaften.org: https://fachschaften.org/
|
|
13519
13501
|
// Submitted by Felix Schäfer <security@fachschaften.org>
|
|
13520
13502
|
fspages.org
|
|
@@ -15267,10 +15249,6 @@ vki.kr
|
|
|
15267
15249
|
// Submitted by yumenewa <admin@project-study.com>
|
|
15268
15250
|
dev.project-study.com
|
|
15269
15251
|
|
|
15270
|
-
// Protonet GmbH : http://protonet.io
|
|
15271
|
-
// Submitted by Martin Meier <admin@protonet.io>
|
|
15272
|
-
protonet.io
|
|
15273
|
-
|
|
15274
15252
|
// PSL Sandbox : https://github.com/groundcat/PSL-Sandbox
|
|
15275
15253
|
// Submitted by groundcat <psl-sandbox@alumni.upenn.edu>
|
|
15276
15254
|
platter-app.dev
|
|
@@ -15452,10 +15430,6 @@ repl.run
|
|
|
15452
15430
|
resindevice.io
|
|
15453
15431
|
devices.resinstaging.io
|
|
15454
15432
|
|
|
15455
|
-
// RethinkDB : https://www.rethinkdb.com/
|
|
15456
|
-
// Submitted by Chris Kastorff <info@rethinkdb.com>
|
|
15457
|
-
hzc.io
|
|
15458
|
-
|
|
15459
15433
|
// Rico Developments Limited : https://adimo.co
|
|
15460
15434
|
// Submitted by Colin Brown <hello@adimo.co>
|
|
15461
15435
|
adimo.co.uk
|
|
@@ -15878,10 +15852,6 @@ indevs.in
|
|
|
15878
15852
|
musician.io
|
|
15879
15853
|
novecore.site
|
|
15880
15854
|
|
|
15881
|
-
// Standard Library : https://stdlib.com
|
|
15882
|
-
// Submitted by Jacob Lee <jacob@stdlib.com>
|
|
15883
|
-
api.stdlib.com
|
|
15884
|
-
|
|
15885
15855
|
// statichost.eu : https://www.statichost.eu
|
|
15886
15856
|
// Submitted by Eric Selin <admin@statichost.eu>
|
|
15887
15857
|
statichost.page
|
|
@@ -15908,10 +15878,6 @@ ipfs.w3s.link
|
|
|
15908
15878
|
// Submitted by Tony Schirmer <tony@storebase.io>
|
|
15909
15879
|
storebase.store
|
|
15910
15880
|
|
|
15911
|
-
// Storj Labs Inc. : https://storj.io/
|
|
15912
|
-
// Submitted by Philip Hutchins <hostmaster@storj.io>
|
|
15913
|
-
storj.farm
|
|
15914
|
-
|
|
15915
15881
|
// Strapi : https://strapi.io/
|
|
15916
15882
|
// Submitted by Florent Baldino <security@strapi.io>
|
|
15917
15883
|
strapiapp.com
|