codex-channel-bgos 0.2.0 → 0.2.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"attachment-bridge.d.ts","sourceRoot":"","sources":["../src/attachment-bridge.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAQ7C;;;kEAGkE;AAClE,eAAO,MAAM,YAAY,QAAa,CAAC;AAEvC;;wDAEwD;AACxD,MAAM,WAAW,qBAAqB;IACpC,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;2EACuE;IACvE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,6EAA6E;AAC7E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,gEAAgE;AAChE,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;AAgCtE;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,qBAAqB,GACzB,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAoDxE;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAClD,OAAO,CAAC,mBAAmB,CAAC,CAyD9B"}
1
+ {"version":3,"file":"attachment-bridge.d.ts","sourceRoot":"","sources":["../src/attachment-bridge.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAe7C;;;kEAGkE;AAClE,eAAO,MAAM,YAAY,QAAa,CAAC;AAEvC;;wDAEwD;AACxD,MAAM,WAAW,qBAAqB;IACpC,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;2EACuE;IACvE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,6EAA6E;AAC7E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,gEAAgE;AAChE,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;AAiCtE;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,qBAAqB,GACzB,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA+ExE;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAClD,OAAO,CAAC,mBAAmB,CAAC,CAyD9B"}
@@ -18,8 +18,9 @@
18
18
  import { createWriteStream, promises as fsp, } from "node:fs";
19
19
  import { tmpdir } from "node:os";
20
20
  import { extname, join } from "node:path";
21
- import { Readable } from "node:stream";
21
+ import { Readable, Transform } from "node:stream";
22
22
  import { pipeline } from "node:stream/promises";
23
+ import { MAX_ATTACHMENT_BYTES, AttachmentSizeError, assertDeclaredSizeOk, decodeBase64Capped, fetchAttachmentGuarded, } from "./attachment-guard.js";
23
24
  import { classifyMedia, sniffImageDimensions, toInlineDataUri, } from "./media-classify.js";
24
25
  import { resolveAllowedMediaPath } from "./media-guard.js";
25
26
  /** Threshold below which we inline base64 in a single POST. Mirrors the
@@ -57,7 +58,8 @@ function decodeDataUri(dataUri) {
57
58
  // to support them - agents would have to re-encode anyway).
58
59
  throw new Error("invalid data URI: only base64 encoding supported");
59
60
  }
60
- return Buffer.from(payload, "base64");
61
+ // Capped decode so a hostile backend cannot force a giant allocation.
62
+ return decodeBase64Capped(payload);
61
63
  }
62
64
  /**
63
65
  * Download a BGOS attachment to a local tempfile and return its path +
@@ -78,8 +80,8 @@ export async function ingestBgosAttachment(att) {
78
80
  .slice(2, 10)}${ext}`;
79
81
  const localPath = join(tmpdir(), baseName);
80
82
  if (att.fileData) {
81
- // Inline base64 - write directly.
82
- await fsp.writeFile(localPath, Buffer.from(att.fileData, "base64"));
83
+ // Inline base64; write directly under a size cap.
84
+ await fsp.writeFile(localPath, decodeBase64Capped(att.fileData));
83
85
  return { localPath, kind, mimeType };
84
86
  }
85
87
  if (att.dataUri) {
@@ -87,18 +89,41 @@ export async function ingestBgosAttachment(att) {
87
89
  return { localPath, kind, mimeType };
88
90
  }
89
91
  if (att.url) {
90
- // Presigned S3 URL - stream to disk so we don't buffer giant files
91
- // in memory.
92
- const res = await fetch(att.url);
92
+ // Presigned S3 URL. SECURITY: att.url is server-controlled, so validate it
93
+ // against SSRF (no loopback / link-local / RFC1918 / cloud-metadata; every
94
+ // redirect hop re-checked) BEFORE fetching, and stream to disk under a hard
95
+ // byte cap so a hostile backend cannot fill the disk.
96
+ const res = await fetchAttachmentGuarded(att.url);
93
97
  if (!res.ok) {
94
98
  throw new Error(`download failed: HTTP ${res.status} for ${fileName}`);
95
99
  }
96
100
  if (!res.body)
97
101
  throw new Error(`download produced no body for ${fileName}`);
102
+ // Reject an oversized declared length up front; the counting stream below
103
+ // is the real cap for a lying/absent Content-Length.
104
+ assertDeclaredSizeOk(res.headers.get("content-length"));
105
+ let received = 0;
106
+ const capStream = new Transform({
107
+ transform(chunk, _enc, cb) {
108
+ received += chunk.length;
109
+ if (received > MAX_ATTACHMENT_BYTES) {
110
+ cb(new AttachmentSizeError(`attachment ${fileName} exceeded the ${MAX_ATTACHMENT_BYTES} byte cap`));
111
+ return;
112
+ }
113
+ cb(null, chunk);
114
+ },
115
+ });
98
116
  // Node 18+ supports converting a fetch ReadableStream to a Node
99
117
  // Readable via Readable.fromWeb. The any-cast keeps the typecheck
100
118
  // narrow (lib.dom.d.ts inclusion varies by tsconfig).
101
- await pipeline(Readable.fromWeb(res.body), createWriteStream(localPath));
119
+ try {
120
+ await pipeline(Readable.fromWeb(res.body), capStream, createWriteStream(localPath));
121
+ }
122
+ catch (err) {
123
+ // Remove any partial file so a capped/failed download leaves no litter.
124
+ await fsp.unlink(localPath).catch(() => { });
125
+ throw err;
126
+ }
102
127
  return { localPath, kind, mimeType };
103
128
  }
104
129
  if (att.s3Key) {
@@ -1 +1 @@
1
- {"version":3,"file":"attachment-bridge.js","sourceRoot":"","sources":["../src/attachment-bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"attachment-bridge.js","sourceRoot":"","sources":["../src/attachment-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /** Hard cap on bytes pulled from a single server-supplied attachment. */
2
+ export declare const MAX_ATTACHMENT_BYTES: number;
3
+ /** Thrown when a server-supplied attachment URL is unsafe (SSRF guard). */
4
+ export declare class AttachmentUrlError extends Error {
5
+ constructor(message: string);
6
+ }
7
+ /** Thrown when a server-supplied attachment exceeds the byte cap. */
8
+ export declare class AttachmentSizeError extends Error {
9
+ constructor(message: string);
10
+ }
11
+ /**
12
+ * Canonicalize a numeral-encoded IPv4 host (a bare decimal/hex/octal integer,
13
+ * or a dotted form with 1 to 4 parts, e.g. "2130706433", "0x7f000001",
14
+ * "0177.0.0.1", "127.1") into dotted-quad notation, per the same numeral
15
+ * rules a raw socket connect (or a permissive DNS/HTTP client) would apply.
16
+ * Returns:
17
+ * - the canonical "a.b.c.d" string when the host is a valid numeral form;
18
+ * - null when the host is not numeral shaped at all (an ordinary name);
19
+ * - "ambiguous" when the host LOOKS numeral shaped but fails to parse
20
+ * cleanly. Callers must fail closed (treat "ambiguous" as unsafe).
21
+ * Pure.
22
+ */
23
+ export declare function canonicalizeNumericIPv4(host: string): string | null | "ambiguous";
24
+ /**
25
+ * True when an IPv4/IPv6 literal is loopback, link-local, private (RFC1918),
26
+ * carrier-grade NAT, unique-local, unspecified, or a known cloud-metadata
27
+ * address. Malformed input is treated as unsafe (fail closed). Pure.
28
+ */
29
+ export declare function isPrivateOrReservedIp(ip: string): boolean;
30
+ /**
31
+ * True when a hostname must be refused before any DNS lookup: literal loopback
32
+ * names, `.localhost` / `.local` (mDNS), an empty host, or a private/reserved
33
+ * IP literal. Pure.
34
+ */
35
+ export declare function isBlockedHostname(host: string): boolean;
36
+ /** Injectable DNS resolver (for tests). Returns candidate addresses. */
37
+ export type AttachmentResolver = (host: string) => Promise<Array<{
38
+ address: string;
39
+ }>>;
40
+ /**
41
+ * Validate a server-supplied download URL against SSRF: http/https only, and
42
+ * neither the literal host nor any DNS-resolved address may be loopback,
43
+ * link-local, private, CGNAT, unique-local, or cloud-metadata. Returns the
44
+ * parsed URL on success; throws AttachmentUrlError otherwise. The resolver is
45
+ * injectable so the classification logic is unit-testable without a network.
46
+ */
47
+ export declare function assertSafeDownloadUrl(raw: string, resolver?: AttachmentResolver): Promise<URL>;
48
+ /**
49
+ * Fetch a server-supplied URL with SSRF protection, re-validating every
50
+ * redirect hop (a public host must not 30x-redirect into a private one).
51
+ * Returns the terminal Response (body still unread) so the caller can stream it
52
+ * under a byte cap. Bounded to a few hops.
53
+ */
54
+ export declare function fetchAttachmentGuarded(raw: string, resolver?: AttachmentResolver, fetchImpl?: typeof fetch): Promise<Response>;
55
+ /**
56
+ * Reject an already-declared Content-Length that exceeds the cap. Returns the
57
+ * parsed length (or null when absent/unparseable). Pure.
58
+ */
59
+ export declare function assertDeclaredSizeOk(contentLength: string | null, cap?: number): number | null;
60
+ /**
61
+ * Decode a base64 payload with an up-front size cap so a hostile inline body
62
+ * cannot force a multi-hundred-MB allocation. Throws AttachmentSizeError when
63
+ * the decoded size would exceed the cap. Pure.
64
+ */
65
+ export declare function decodeBase64Capped(b64: string, cap?: number): Buffer;
66
+ //# sourceMappingURL=attachment-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-guard.d.ts","sourceRoot":"","sources":["../src/attachment-guard.ts"],"names":[],"mappings":"AAuBA,yEAAyE;AACzE,eAAO,MAAM,oBAAoB,QAAoB,CAAC;AAEtD,2EAA2E;AAC3E,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,qEAAqE;AACrE,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AA0BD;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,WAAW,CA4BjF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAiCzD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAkBvD;AAED,wEAAwE;AACxE,MAAM,MAAM,kBAAkB,GAAG,CAC/B,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAAC;AAKzC;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,kBAAoC,GAC7C,OAAO,CAAC,GAAG,CAAC,CAwCd;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,kBAAoC,EAC9C,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,QAAQ,CAAC,CAgBnB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,GAAG,SAAuB,GACzB,MAAM,GAAG,IAAI,CAUf;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,GAAG,SAAuB,GACzB,MAAM,CASR"}
@@ -0,0 +1,290 @@
1
+ /**
2
+ * Inbound-attachment safety guard (SSRF + resource-exhaustion).
3
+ *
4
+ * SECURITY: `ingestBgosAttachment` (attachment-bridge.ts) turns a BGOS
5
+ * `inbound_message` `files[]` entry into a local temp file. The `url`,
6
+ * `fileData`, and `dataUri` fields are all set by the BGOS backend, and the
7
+ * threat model treats a compromised or MITM'd backend as an in-scope adversary.
8
+ * Without a guard, a hostile backend could:
9
+ * - point `url` at http://169.254.169.254/ (cloud metadata), http://127.0.0.1
10
+ * (a local service), or an RFC1918 host, making the victim daemon issue
11
+ * arbitrary internal requests (blind/read SSRF);
12
+ * - stream an unbounded body (or send a multi-hundred-MB base64 `fileData`)
13
+ * to exhaust the host's disk or memory.
14
+ *
15
+ * This module holds the PURE, unit-tested predicates (IP + hostname
16
+ * classification, capped base64 decode) plus the redirect-revalidating fetch
17
+ * used at the boundary. The byte cap matches BGOS's largest outbound media
18
+ * ceiling (video, 100 MB) so a legitimate attachment is never rejected while an
19
+ * unbounded stream is stopped. No em/en dashes (this file feeds no prompt, but
20
+ * the repo convention is ASCII-only).
21
+ */
22
+ import { lookup as dnsLookup } from "node:dns/promises";
23
+ /** Hard cap on bytes pulled from a single server-supplied attachment. */
24
+ export const MAX_ATTACHMENT_BYTES = 100 * 1024 * 1024;
25
+ /** Thrown when a server-supplied attachment URL is unsafe (SSRF guard). */
26
+ export class AttachmentUrlError extends Error {
27
+ constructor(message) {
28
+ super(message);
29
+ this.name = "AttachmentUrlError";
30
+ }
31
+ }
32
+ /** Thrown when a server-supplied attachment exceeds the byte cap. */
33
+ export class AttachmentSizeError extends Error {
34
+ constructor(message) {
35
+ super(message);
36
+ this.name = "AttachmentSizeError";
37
+ }
38
+ }
39
+ /**
40
+ * Parse a single IPv4 numeral component per the same rules a numeric-address
41
+ * evasion relies on: a 0x/0X prefix is hexadecimal, a bare leading zero (with
42
+ * more digits after it) is octal, anything else is decimal. Returns null when
43
+ * the token is not a valid numeral in its implied radix. Pure.
44
+ */
45
+ function parseIpv4Component(part) {
46
+ if (part === "")
47
+ return null;
48
+ let radix = 10;
49
+ let digits = part;
50
+ if (digits.length > 1 && digits[0] === "0" && (digits[1] === "x" || digits[1] === "X")) {
51
+ radix = 16;
52
+ digits = digits.slice(2);
53
+ }
54
+ else if (digits.length > 1 && digits[0] === "0") {
55
+ radix = 8;
56
+ digits = digits.slice(1);
57
+ }
58
+ if (digits === "")
59
+ return 0;
60
+ const pattern = radix === 16 ? /^[0-9a-fA-F]+$/ : radix === 8 ? /^[0-7]+$/ : /^[0-9]+$/;
61
+ if (!pattern.test(digits))
62
+ return null;
63
+ const value = parseInt(digits, radix);
64
+ return Number.isSafeInteger(value) ? value : null;
65
+ }
66
+ /**
67
+ * Canonicalize a numeral-encoded IPv4 host (a bare decimal/hex/octal integer,
68
+ * or a dotted form with 1 to 4 parts, e.g. "2130706433", "0x7f000001",
69
+ * "0177.0.0.1", "127.1") into dotted-quad notation, per the same numeral
70
+ * rules a raw socket connect (or a permissive DNS/HTTP client) would apply.
71
+ * Returns:
72
+ * - the canonical "a.b.c.d" string when the host is a valid numeral form;
73
+ * - null when the host is not numeral shaped at all (an ordinary name);
74
+ * - "ambiguous" when the host LOOKS numeral shaped but fails to parse
75
+ * cleanly. Callers must fail closed (treat "ambiguous" as unsafe).
76
+ * Pure.
77
+ */
78
+ export function canonicalizeNumericIPv4(host) {
79
+ // Only characters a numeral IPv4 form can use; anything else (a real DNS
80
+ // label with letters outside a-f) is an ordinary hostname, not a candidate.
81
+ if (!/^[0-9a-fA-FxX.]+$/.test(host))
82
+ return null;
83
+ if (!/\d/.test(host))
84
+ return null; // no digit at all -> not numeral shaped
85
+ const parts = host.split(".");
86
+ if (parts.length === 0 || parts.length > 4)
87
+ return null;
88
+ if (parts.some((p) => p === ""))
89
+ return "ambiguous";
90
+ const numbers = [];
91
+ for (const part of parts) {
92
+ const n = parseIpv4Component(part);
93
+ if (n === null)
94
+ return "ambiguous";
95
+ numbers.push(n);
96
+ }
97
+ // All but the last component must fit a single octet; the last absorbs
98
+ // the remaining bits (so "127.1" folds to 127.0.0.1).
99
+ for (let i = 0; i < numbers.length - 1; i++) {
100
+ if (numbers[i] > 255)
101
+ return "ambiguous";
102
+ }
103
+ const last = numbers[numbers.length - 1];
104
+ const maxLast = 256 ** (5 - numbers.length) - 1;
105
+ if (last > maxLast || last < 0)
106
+ return "ambiguous";
107
+ let value = last;
108
+ for (let i = 0; i < numbers.length - 1; i++) {
109
+ value += numbers[i] * 256 ** (3 - i);
110
+ }
111
+ const bytes = [(value >>> 24) & 0xff, (value >>> 16) & 0xff, (value >>> 8) & 0xff, value & 0xff];
112
+ return bytes.join(".");
113
+ }
114
+ /**
115
+ * True when an IPv4/IPv6 literal is loopback, link-local, private (RFC1918),
116
+ * carrier-grade NAT, unique-local, unspecified, or a known cloud-metadata
117
+ * address. Malformed input is treated as unsafe (fail closed). Pure.
118
+ */
119
+ export function isPrivateOrReservedIp(ip) {
120
+ const addr = ip.trim().toLowerCase().replace(/^\[|\]$/g, "");
121
+ if (!addr)
122
+ return true;
123
+ // IPv4-mapped IPv6 (e.g. ::ffff:127.0.0.1) collapses to its v4 tail.
124
+ const v4 = addr.startsWith("::ffff:") ? addr.slice("::ffff:".length) : addr;
125
+ // A numeral-encoded IPv4 host (decimal integer, 0x-hex, octal, or a short
126
+ // dotted form like "127.1") must be canonicalized before classification;
127
+ // otherwise "2130706433" (127.0.0.1) or "0x7f000001" slips past the plain
128
+ // dotted-quad regex below untouched. A host that looks numeral shaped but
129
+ // fails to parse cleanly is unsafe (fail closed).
130
+ const canon = canonicalizeNumericIPv4(v4);
131
+ if (canon === "ambiguous")
132
+ return true;
133
+ const dotted = canon ?? v4;
134
+ const m = dotted.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);
135
+ if (m) {
136
+ const o = m.slice(1, 5).map(Number);
137
+ if (o.some((x) => x > 255))
138
+ return true; // malformed octet -> unsafe
139
+ const [a, b] = o;
140
+ if (a === 0)
141
+ return true; // 0.0.0.0/8 unspecified
142
+ if (a === 127)
143
+ return true; // loopback
144
+ if (a === 10)
145
+ return true; // RFC1918
146
+ if (a === 172 && b >= 16 && b <= 31)
147
+ return true; // RFC1918
148
+ if (a === 192 && b === 168)
149
+ return true; // RFC1918
150
+ if (a === 169 && b === 254)
151
+ return true; // link-local incl 169.254.169.254
152
+ if (a === 100 && b >= 64 && b <= 127)
153
+ return true; // CGNAT 100.64.0.0/10
154
+ return false;
155
+ }
156
+ // IPv6 forms.
157
+ if (addr === "::" || addr === "::1")
158
+ return true; // unspecified / loopback
159
+ if (addr.startsWith("fe80"))
160
+ return true; // link-local fe80::/10
161
+ if (addr.startsWith("fc") || addr.startsWith("fd"))
162
+ return true; // ULA fc00::/7
163
+ if (addr.startsWith("::ffff:"))
164
+ return true; // mapped form we did not decode -> unsafe
165
+ return false;
166
+ }
167
+ /**
168
+ * True when a hostname must be refused before any DNS lookup: literal loopback
169
+ * names, `.localhost` / `.local` (mDNS), an empty host, or a private/reserved
170
+ * IP literal. Pure.
171
+ */
172
+ export function isBlockedHostname(host) {
173
+ const h = host
174
+ .trim()
175
+ .toLowerCase()
176
+ .replace(/\.$/, "")
177
+ .replace(/^\[|\]$/g, "");
178
+ if (!h)
179
+ return true;
180
+ if (h === "localhost" || h.endsWith(".localhost"))
181
+ return true;
182
+ if (h === "ip6-localhost" || h === "ip6-loopback")
183
+ return true;
184
+ if (h.endsWith(".local"))
185
+ return true; // mDNS
186
+ // IP literal? Dotted-quad, IPv6 (contains a colon), or a numeral-encoded
187
+ // form (decimal integer, 0x-hex, octal, short dotted like "127.1") that
188
+ // canonicalizes to an IPv4 address, or an ambiguous numeral that fails to
189
+ // canonicalize cleanly (fail closed rather than falling through as a name).
190
+ if (/^[0-9.]+$/.test(h) || h.includes(":") || canonicalizeNumericIPv4(h) !== null) {
191
+ return isPrivateOrReservedIp(h);
192
+ }
193
+ return false;
194
+ }
195
+ const defaultResolver = (host) => dnsLookup(host, { all: true });
196
+ /**
197
+ * Validate a server-supplied download URL against SSRF: http/https only, and
198
+ * neither the literal host nor any DNS-resolved address may be loopback,
199
+ * link-local, private, CGNAT, unique-local, or cloud-metadata. Returns the
200
+ * parsed URL on success; throws AttachmentUrlError otherwise. The resolver is
201
+ * injectable so the classification logic is unit-testable without a network.
202
+ */
203
+ export async function assertSafeDownloadUrl(raw, resolver = defaultResolver) {
204
+ let u;
205
+ try {
206
+ u = new URL(raw);
207
+ }
208
+ catch {
209
+ throw new AttachmentUrlError("malformed attachment URL");
210
+ }
211
+ if (u.protocol !== "https:" && u.protocol !== "http:") {
212
+ throw new AttachmentUrlError(`unsupported attachment URL scheme: ${u.protocol}`);
213
+ }
214
+ const host = u.hostname;
215
+ if (isBlockedHostname(host)) {
216
+ throw new AttachmentUrlError(`refusing to fetch attachment from a private or reserved host: ${host}`);
217
+ }
218
+ const bare = host.replace(/^\[|\]$/g, "");
219
+ const isIpLiteral = /^[0-9.]+$/.test(bare) || bare.includes(":") || canonicalizeNumericIPv4(bare) !== null;
220
+ if (!isIpLiteral) {
221
+ let addrs;
222
+ try {
223
+ addrs = await resolver(host);
224
+ }
225
+ catch {
226
+ throw new AttachmentUrlError(`could not resolve attachment host: ${host}`);
227
+ }
228
+ if (!addrs || addrs.length === 0) {
229
+ throw new AttachmentUrlError(`attachment host did not resolve: ${host}`);
230
+ }
231
+ for (const a of addrs) {
232
+ if (isPrivateOrReservedIp(a.address)) {
233
+ throw new AttachmentUrlError(`attachment host ${host} resolves to a private or reserved address ${a.address}`);
234
+ }
235
+ }
236
+ }
237
+ return u;
238
+ }
239
+ /**
240
+ * Fetch a server-supplied URL with SSRF protection, re-validating every
241
+ * redirect hop (a public host must not 30x-redirect into a private one).
242
+ * Returns the terminal Response (body still unread) so the caller can stream it
243
+ * under a byte cap. Bounded to a few hops.
244
+ */
245
+ export async function fetchAttachmentGuarded(raw, resolver = defaultResolver, fetchImpl = fetch) {
246
+ let current = (await assertSafeDownloadUrl(raw, resolver)).toString();
247
+ for (let hop = 0; hop < 5; hop++) {
248
+ const res = await fetchImpl(current, { redirect: "manual" });
249
+ if (res.status >= 300 && res.status < 400) {
250
+ const loc = res.headers.get("location");
251
+ if (!loc) {
252
+ throw new AttachmentUrlError("attachment redirect had no Location");
253
+ }
254
+ const next = new URL(loc, current).toString();
255
+ current = (await assertSafeDownloadUrl(next, resolver)).toString();
256
+ continue;
257
+ }
258
+ return res;
259
+ }
260
+ throw new AttachmentUrlError("attachment exceeded the redirect limit");
261
+ }
262
+ /**
263
+ * Reject an already-declared Content-Length that exceeds the cap. Returns the
264
+ * parsed length (or null when absent/unparseable). Pure.
265
+ */
266
+ export function assertDeclaredSizeOk(contentLength, cap = MAX_ATTACHMENT_BYTES) {
267
+ if (contentLength == null || contentLength === "")
268
+ return null;
269
+ const n = Number(contentLength);
270
+ if (!Number.isFinite(n) || n < 0)
271
+ return null;
272
+ if (n > cap) {
273
+ throw new AttachmentSizeError(`attachment declares ${n} bytes, over the ${cap} byte cap`);
274
+ }
275
+ return n;
276
+ }
277
+ /**
278
+ * Decode a base64 payload with an up-front size cap so a hostile inline body
279
+ * cannot force a multi-hundred-MB allocation. Throws AttachmentSizeError when
280
+ * the decoded size would exceed the cap. Pure.
281
+ */
282
+ export function decodeBase64Capped(b64, cap = MAX_ATTACHMENT_BYTES) {
283
+ // 4 base64 chars decode to 3 bytes; this bounds size without allocating.
284
+ const approxBytes = Math.floor((b64.length * 3) / 4);
285
+ if (approxBytes > cap) {
286
+ throw new AttachmentSizeError(`inline attachment (~${approxBytes} bytes) exceeds the ${cap} byte cap`);
287
+ }
288
+ return Buffer.from(b64, "base64");
289
+ }
290
+ //# sourceMappingURL=attachment-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-guard.js","sourceRoot":"","sources":["../src/attachment-guard.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bgos-api.d.ts","sourceRoot":"","sources":["../src/bgos-api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bgos-api.d.ts","sourceRoot":"","sources":["../src/bgos-api.ts"],"names":[],"mappings":"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"}
package/dist/bgos-api.js CHANGED
@@ -46,8 +46,15 @@ export class BgosApi {
46
46
  * endpoint) throws, and the caller keeps the bundled fallback.
47
47
  */
48
48
  async getCapabilities(channel = "codex") {
49
+ // SECURITY: cap the response size at the transport layer. The canon is a
50
+ // few KB and is written to AGENTS.md for a shell-capable agent, so a
51
+ // compromised or MITM'd backend must not be able to stream a giant body
52
+ // (disk/memory DoS). axios rejects past maxContentLength and the caller
53
+ // keeps the bundled fallback.
49
54
  const r = await this.http.get("integrations/capabilities", {
50
55
  params: { channel },
56
+ maxContentLength: 1024 * 1024,
57
+ maxBodyLength: 1024 * 1024,
51
58
  });
52
59
  return r.data;
53
60
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bgos-api.js","sourceRoot":"","sources":["../src/bgos-api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bgos-api.js","sourceRoot":"","sources":["../src/bgos-api.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,13 @@
1
1
  /** The bundled, offline fallback shipped with the daemon. */
2
2
  export declare const BUNDLED_CAPABILITIES = "# BGOS Channel, Agent Capabilities\n\nYou are reachable from the BGOS chat app. Your text reply is delivered to the\nuser as a chat message. A few markers let you use richer BGOS features. Put each\nmarker on its own line. The daemon strips markers from the visible text.\n\n## Markdown\nSupported: **bold**, *italic*, `inline code`, fenced code blocks, [links](url),\n# / ## / ### headings, ordered and unordered lists, > blockquotes.\nNOT supported: tables (they do not lay out on mobile), inline images via\n![alt](url) (use MEDIA: instead), strikethrough. Do not escape punctuation; this\nis not Telegram MarkdownV2.\n\n## Sending files, images, videos (you to user)\nPut `MEDIA:/absolute/path/to/file` on its own line. The daemon infers the type\nfrom the extension and uploads it (inline under 500 KB, presigned S3 otherwise).\nCaps: image 10 MB, video 100 MB, audio 25 MB, document 25 MB. Multiple MEDIA:\nlines send multiple files in one bubble. Surrounding sentences remain visible.\n\n## Inline option buttons (non-blocking)\nOffer up to 6 tappable choices. The user can still type instead.\n[[BGOS_BUTTONS]]\nYes, ship it | ship\nHold off | hold\n[[/BGOS_BUTTONS]]\nEach line is `Label | value`. The value comes back to you as the user's next\nmessage when they tap. Any text before the block is the question.\n\n## ask_user_input (blocking questions)\nAsk 1 to 4 questions the user must answer before continuing.\n[[BGOS_ASK]]\nQ: Which environment?\nStaging | staging\nProduction | prod\nQ: Proceed now?\nnoskip\nYes | yes\n[[/BGOS_ASK]]\nOptions are `Label | value`. Add `noskip` to require an answer, `nofreetext`\nto disallow a typed answer. Each answer arrives as your next message.\n\n## Status line\nShow a short working status with `STATUS: <text>` on its own line (for example\n`STATUS: running tests`). An empty `STATUS:` clears it.\n\n## Tool activity (automatic)\nYour shell commands, file edits, MCP tool calls, and web searches are shown to\nthe user as a live tool-progress card automatically. You do not need to report\nthem.\n\n## Files the user sends you\nImages are attached to your input directly. Other files are downloaded and their\nabsolute path is given to you inline as `[File attached: /path (mime)]`; read\nthem from disk as needed.\n\n## Slash commands\n`/new` starts a fresh conversation (your thread is reset). `/retry` re-runs the\nuser's last message. `/status` shows daemon health. These are handled by the\ndaemon; you will not see them.\n\n## Not supported here\nNo group chats, threads, or message editing. Dangerous-command approval prompts\nare not surfaced to BGOS in this version; run within your sandbox.\n";
3
+ /**
4
+ * Upper bound on an accepted served canon. The real canon is a few KB; this is
5
+ * ~50x headroom. SECURITY: the served text is written to AGENTS.md and read by
6
+ * a shell-capable Codex agent, so a compromised or MITM'd backend returning a
7
+ * multi-MB body would be both a disk/memory-DoS and an unbounded prompt-injection
8
+ * surface. Over the cap we fall back to the bundled copy.
9
+ */
10
+ export declare const MAX_CANON_BYTES: number;
3
11
  /** Shape of GET /integrations/capabilities?channel=codex. */
4
12
  export interface ServedCapabilities {
5
13
  channel: string;
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAiBA,6DAA6D;AAC7D,eAAO,MAAM,oBAAoB,ymFAAmB,CAAC;AAErD,6DAA6D;AAC7D,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAGxE;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,EAC9C,OAAO,GAAE,MAA6B,GACrC,kBAAkB,CAUpB"}
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAiBA,6DAA6D;AAC7D,eAAO,MAAM,oBAAoB,ymFAAmB,CAAC;AAErD;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,QAAa,CAAC;AAE1C,6DAA6D;AAC7D,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAGxE;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,EAC9C,OAAO,GAAE,MAA6B,GACrC,kBAAkB,CAWpB"}
@@ -16,6 +16,14 @@
16
16
  import { BGOS_AGENT_HINTS } from "./agent-hints.js";
17
17
  /** The bundled, offline fallback shipped with the daemon. */
18
18
  export const BUNDLED_CAPABILITIES = BGOS_AGENT_HINTS;
19
+ /**
20
+ * Upper bound on an accepted served canon. The real canon is a few KB; this is
21
+ * ~50x headroom. SECURITY: the served text is written to AGENTS.md and read by
22
+ * a shell-capable Codex agent, so a compromised or MITM'd backend returning a
23
+ * multi-MB body would be both a disk/memory-DoS and an unbounded prompt-injection
24
+ * surface. Over the cap we fall back to the bundled copy.
25
+ */
26
+ export const MAX_CANON_BYTES = 256 * 1024;
19
27
  /**
20
28
  * Whether a payload looks like a real BGOS capability canon. The served text
21
29
  * opens with "# BGOS Channel Agent Capabilities" and the bundled copy with
@@ -36,6 +44,7 @@ export function pickCapabilitiesText(fetched, bundled = BUNDLED_CAPABILITIES) {
36
44
  const served = fetched?.text;
37
45
  if (typeof served === "string" &&
38
46
  served.trim().length > 0 &&
47
+ served.length <= MAX_CANON_BYTES &&
39
48
  hasCanonMarkers(served)) {
40
49
  return { text: served, source: "backend" };
41
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAWrD;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAA+B;IAC7D,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;AAC9E,CAAC;AAOD;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAA8C,EAC9C,UAAkB,oBAAoB;IAEtC,MAAM,MAAM,GAAG,OAAO,EAAE,IAAI,CAAC;IAC7B,IACE,OAAO,MAAM,KAAK,QAAQ;QAC1B,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACxB,eAAe,CAAC,MAAM,CAAC,EACvB,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC7C,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,GAAG,IAAI,CAAC;AAW1C;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAA+B;IAC7D,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;AAC9E,CAAC;AAOD;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAA8C,EAC9C,UAAkB,oBAAoB;IAEtC,MAAM,MAAM,GAAG,OAAO,EAAE,IAAI,CAAC;IAC7B,IACE,OAAO,MAAM,KAAK,QAAQ;QAC1B,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACxB,MAAM,CAAC,MAAM,IAAI,eAAe;QAChC,eAAe,CAAC,MAAM,CAAC,EACvB,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC7C,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC9C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codex-channel-bgos",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "BGOS channel adapter for OpenAI Codex: pair, WS + REST client, Codex SDK host, outbound modalities, one-paste connect",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",