Skip to content

fix(reliability): redact hostile Hangul option access failures #366

Description

@seonghobae

Current authoritative state

This hostile-option-access defect is repaired on the existing canonical single-writer Draft PR #320 / branch feat/hwp-hwpx-authoring. Protected shipped truth remains main@3b38ead2d00f44eb578d0689087b9293b3dabe1e; current exact Draft head is 5ee6e4d0c3b2a804f39a8d186a8bdd7c2a38a782.

Current src/hangul/index.ts uses module-owned readHangulOption() for the host-supplied engine, import maxSourceBytes, export maxOutputBytes, and export format reads before those values cross into engine/resource authority. If an accessor or Proxy trap throws, Inkspan catches the unknown thrown value without reading, stringifying, coercing, enumerating, or prototype-inspecting it and raises the stable payload-redacted HangulDocumentError('INVALID_CONFIGURATION', 'Hangul options are invalid.').

Numeric byte-limit validation and its existing messages remain authoritative after a successful read; omitted/default HWPX selection and explicit HWP/HWPX semantics are unchanged. Cleanup containment (#365), finite structural-metadata ceilings (#367), supported-content behavior, standalone/no-network operation, and host-owned engine authority remain preserved.

This is Inkspan-owned local argument/error-containment scope. Hosts still own the actual HWP/HWPX engine, filesystem/network/WASM initialization, credentials, persistence, publication, and telemetry.

Test-first lineage

  • RED 907b088a77a6c0324b2907cba13235da8d508e58 proved hostile getters for maxSourceBytes, maxOutputBytes, and format could leak private thrown values before engine authority.
  • GREEN 0786240d8e30e66effd8326fad3d5d67af427f4d added module-owned readHangulOption() containment with stable INVALID_CONFIGURATION semantics.
  • Current exact head 5ee6e4d0c3b2a804f39a8d186a8bdd7c2a38a782 carries that repair together with later feat(hangul): import, edit, and export HWP/HWPX #320 engine-boundary and documentation hardening; predecessor workflow/review evidence does not transfer after head movement.

Exact-current-head evidence

For unchanged exact head 5ee6e4d0c3b2a804f39a8d186a8bdd7c2a38a782 against protected main@3b38ead2d00f44eb578d0689087b9293b3dabe1e at the latest fresh refetch:

  • CI 32395091285: completed / success; build/test 96510085342 checked out the exact head and completed 161 files / 898 tests at 100% statement/branch/function/line coverage, with package/build verification;
  • Office Python 3.11-3.14 and cross-engine Playwright jobs: completed / success;
  • Security Scan 32395091192: completed / success;
  • SAST Semgrep 32395091052: completed / success;
  • qualifying latest-push independent approval remains absent / non-passing;
  • GitHub reports the Draft mechanically mergeable, which is not integration authorization.

All observed repository-owned exact-head workflows are terminal success. The absent qualifying approval remains non-passing; repository technical success does not replace separately applicable central or review governance.

Integration boundary

The behavioral defect is repaired on active Draft #320 but is not protected-main shipped behavior. Keep this issue open until #320 integrates under live governance. Keep #320 Draft/unmerged while #118 owns the frozen v0.6.0 publication/provenance boundary. Any #320 head/base/ruleset movement invalidates corresponding exact-head evidence and requires fresh revalidation. Do not create a competing Hangul writer, transfer predecessor evidence, self-approve, weaken gates, move protected main, or fabricate release identity.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: authAuthentication, authorization, identity, or tenant isolationarea: ci-cdCI, GitHub Actions, checks, release, or supply chainarea: dataDatabase, schema, migration, ETL, or lineagearea: securitySecurity boundary, hardening, or vulnerability preventionpriority: mediumNormal-priority or P2 workstatus: triagedOpen issue has an organization taxonomy assignmenttype: bugDefect or incorrect behavior

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions