chainlesschain 0.162.188 → 0.162.189

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.
Files changed (188) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-Brr1LVcE.js → AIOps-DbZft8w0.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-DQU74DKG.js → ActionButton-DoOZpwfN.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-CYp9178y.js → Analytics-B0J0KLTW.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-DW4SCYsW.js → AppLayout-D9eIR0qq.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-CYlD_ed1.js → Artifacts-BnZXEVeo.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-CWl1rZOi.js → Audit-X1ce4Bjn.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-BOR-LPsa.js → BackgroundAgents-BvWR-y5v.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-DLpG7j1X.js → Backup-BublSGEd.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-B35K9wdr.js → BaseInput-CR_77Hso.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-CwUJb9gB.js → Chat-DixW52tq.js} +6 -6
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-1v6aMS1m.js → ChatBubbleRenderer-DDHDpBBA.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-pi3-tPNW.js → Checkbox-CCv1C87K.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-FyNF35eL.js → Codegen-B03Cc3dd.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-tGt_JDEr.js → Col-CA06-6pU.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-CC7LonQX.js → Community-Bj881J52.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-BGXrHHjE.js → Compact-UZLTPoaL.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-DSW0TBZ8.js → Compliance-kGwzRb_0.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-Bhk7rbvE.js → Cowork-KundoYM8.js} +2 -2
  20. package/src/assets/web-panel/assets/{Cron-DxyiQ2NZ.js → Cron-BYZyoqDe.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-B2ZkxHok.js → Crosschain-BhrrppBX.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-yOJV99eJ.js → DID-CdC6EguZ.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-CKsttz7D.js → Dashboard-CcQx3J4y.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-CVFldXSL.js → Dropdown-BpijtEzQ.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-Bufv638J.js → EmailListRenderer-DfZjeZTe.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-4ncjoIjL.js → FamilyGuardDashboard-BFYSf69C.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-DsknEDoX.js → Federation-Okdi3pJm.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-Cqe5jWXA.js → FormItemContext-mH-HebKW.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-NAJaFKxc.js → GenericCardRenderer-xivV69x7.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-CszKQpnl.js → Git-1rh_YBwg.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-BXGodXi6.js → Governance-eAXkNxdY.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-CkoYuG2c.js → Inference-CS6dMVTN.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-DFlEr_T0.js → KnowledgeGraph-Bq_TnkvD.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-CVaENddA.js → Logs-KchHtiHt.js} +2 -2
  35. package/src/assets/web-panel/assets/MarkdownRenderer-TabqHW9B.js +1 -0
  36. package/src/assets/web-panel/assets/{Marketplace-CDlLT0fw.js → Marketplace-CsmGcX5X.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-DdwOyszN.js → McpTools-BaPFnnyz.js} +5 -5
  38. package/src/assets/web-panel/assets/{Memory-DKQnkKuG.js → Memory-2m-sUUf7.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-DGseqlzJ.js → MobileBridge-D5nVZBRu.js} +1 -1
  40. package/src/assets/web-panel/assets/MobileProjects-Bo8MLZvT.js +1 -0
  41. package/src/assets/web-panel/assets/{Mtc-O61Vwyli.js → Mtc-3GDvamGa.js} +6 -6
  42. package/src/assets/web-panel/assets/{MtcAudit-Dw2SyasS.js → MtcAudit-D2zGuZCH.js} +4 -4
  43. package/src/assets/web-panel/assets/{Multisig-hSu_l8kf.js → Multisig-BBVQ4t6t.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-CX1Epurr.js → NLProgramming-BIOCyOGp.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-R9xX8o8_.js → Notes-DVwBGpzc.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-jtSNLCuK.js → NotificationSettings-BDnHfIfX.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-BU2Yqq5H.js → OrderTableRenderer-C7Ek20ag.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-Pu2WO-U3.js → Organization-D3SRKaa7.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-BjnqUyFp.js → Overflow-C2B8ahyn.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-jjkvz44c.js → P2P-2iwQzG65.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-69ca_WeR.js → PdhVaultBrowser-CoPiWqMN.js} +4 -4
  52. package/src/assets/web-panel/assets/{Permissions-D4yDpivd.js → Permissions-yV5XNXo5.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-0qsL6iH1.js → PersonalDataHub-uCDJhMUF.js} +5 -5
  54. package/src/assets/web-panel/assets/{Pipeline-Cx7Ybrk2.js → Pipeline-hN7ucMOA.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-PbfR_M_V.js → Privacy-CgU0ptN4.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-CyV6Gsub.js → ProjectInit-CfYPiT6j.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-C7KZ2Wdk.js → ProjectSettings-B0A2C4nw.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-DQDjO-yK.js → Projects-BE5C0ajn.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-DyFVBBMX.js → Providers-CstQPf8W.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-CzB1BC9_.js → QrScannerModal-Co3z_ynk.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-Bk636mC1.js → QuickAsk-DMTS6pQ6.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-DoWxHIT3.js → Recommend-ETw4odUa.js} +1 -1
  63. package/src/assets/web-panel/assets/RemoteSession-B0rkE09d.js +5 -0
  64. package/src/assets/web-panel/assets/{Reputation-BucoReGG.js → Reputation-BTVqQgKq.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-DzmOdJU7.js → Row-CBKKwwtO.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-C1tK7KGU.js → RssFeed-BHUQ438I.js} +2 -2
  67. package/src/assets/web-panel/assets/{Search-CSnInOqk.js → Search-B4NqeUsF.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-dlejr15l.js → Security-BRjoYG5_.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-BioPZuNh.js → Services-CxQzu3p3.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-DWMibwpC.js → Skeleton-BKzwwmWO.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-BAAnx1B2.js → Skills-DrsFcgth.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-jWNp4hNO.js → Sla-D21tmXCH.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-y5kqKha-.js → SpeechSettings-CjyjLfp8.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-B9GNsc3e.js → SyncSettings-Cu45-tnx.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-BDBYKRen.js → Tasks-oMcILYOj.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-DRiE5eaN.js → Templates-Bh-Zcr5R.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-BGlAvExF.js → Tenant-68ns63aI.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-B8uzrbNY.js → Terminal-BLJkFykE.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-Df48iveY.js → TimelineRenderer-xcrJLq-O.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-CcmHndN6.js → Tokens-C6PpFJtf.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-DPkWxmQ2.js → Trigger-BaKA7tdM.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-DTb5a5AV.js → Trust-BzhA57Jc.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-CBmg5vch.js → UkeySign-4_U3JkIR.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-B0mZrz4O.js → VideoEditing-162AANxX.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-Bxs7_mpd.js → Wallet-B1viuql_.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-C8x3cMxU.js → WebAuthn-ZVWazhCy.js} +4 -4
  87. package/src/assets/web-panel/assets/{WorkflowEditor-DPrNznrP.js → WorkflowEditor-tzdyUk-1.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-D3bYWu7S.js → chat-DmrHNuwq.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-DY-PwMu4.js → colors-DAJ_M-PK.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-LDk10Kw6.js → compact-item-uIzmYwLs.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-C-2MZnFq.js → createContext-D_ZmuLwb.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-DIrncrV1.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-BQIBjcnB.js → hasIn-CDt_shTL.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-8JC9BJa1.js → index-BAvSmJXW.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-KFZO_lcx.js → index-BDF6EQBs.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-CiTvBAr-.js → index-BHvlm0In.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-COG61sRv.js → index-BRa4kJ_S.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-lmm9p-jm.js → index-BTCXf1t-.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DTIZpPtG.js → index-Bbxjfstq.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-_HRO_cIu.js → index-Bx4d6c1k.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BRI3ngNg.js → index-ByzGvpR9.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-C3GNvExG.js → index-C16fYKFD.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-D3Oq-DLL.js → index-C5WcdJH2.js} +3 -3
  104. package/src/assets/web-panel/assets/{index-L3smcoQX.js → index-CG0lY4h3.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Dh-tkpKQ.js → index-CKyd472S.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CQVb2dWp.js → index-CaelyMgF.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DY2FIrmz.js → index-CbD_WW_6.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DYyLJPlF.js → index-CcZ9xJI9.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-C7FC8cP2.js → index-CeUpKjvi.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BN-xdSWZ.js → index-Cvak6Oe2.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DSvo_bp0.js → index-CzXqvMuP.js} +1 -1
  112. package/src/assets/web-panel/assets/index-D-Swwqld.js +1 -0
  113. package/src/assets/web-panel/assets/{index-BdXnYMCZ.js → index-D4n1lGTB.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-L6qixyLc.js → index-D9OE8B3d.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-VCh5zNJo.js → index-DBFmcaCQ.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DlRYqt3S.js → index-DdUMcwRB.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-k7C_oDCO.js → index-DeGBoLQA.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-7xKu7Fns.js → index-DfSSy9uy.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CY4KnaO9.js → index-DqDSF2RW.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-HasPt4-h.js → index-DvFhhe6r.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CaslYch6.js → index-DwfvPe-j.js} +1 -1
  122. package/src/assets/web-panel/assets/index-FMZAMKy8.js +1 -0
  123. package/src/assets/web-panel/assets/{index-B5pgtZnY.js → index-FyplHuNt.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-Cz4b6Z_7.js → index-GcKOHD_c.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BI4KgcYC.js → index-OzTxFIJP.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BX2b9Orc.js → index-QsgfSZrV.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CbR6ROOa.js → index-Z8P4BexE.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BrnRO9yE.js → index-clSX4PEc.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-Dd2Km97U.js → index-ifxmu8SY.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DhRt9cYJ.js → index-rS3gl_68.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-D4K1weKc.js → index-rXdwUeE3.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Cx6D_dx2.js → index-saf3VNeP.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-zQPSHf2C.js → initDefaultProps-pmfaD-aK.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-CKCStGVk.js → motion-CaQ2CpYF.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-BufVDGYF.js → move-CkKTqNbI.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-DcaFxy5D.js → mtc-parser-Dd4xsgRI.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-EScpkGdo.js → omit-BFuA5YEs.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-72hG_qfT.js → pickAttrs-DDfxOAJc.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-CMFWiH20.js → placementArrow-Be595JCp.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-DKQHS41p.js → responsiveObserve-7byljUM3.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-QVAFHTIQ.js → slide-CTWfOTaY.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-DIz38e2G.js → statusUtils-CNZOuIxM.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-zK5cyLby.js → styleChecker-DwOcBV78.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-DhZngk62.js → useFlexGapSupport-B6MNwAO9.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-BvV2cvkg.js → useFs-CzyQjH9r.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-CRmxb9l3.js → usePersonalDataHub-Dxh3KiVA.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-CgQIbobP.js → vnode-DVfZiS5N.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-D4XrrO0R.js → zoom-BYme7fbY.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/commands/agent.js +22 -0
  151. package/src/commands/checkpoint-managed.js +1059 -0
  152. package/src/commands/checkpoint.js +3 -0
  153. package/src/commands/team-distributed.js +3324 -0
  154. package/src/commands/team.js +1130 -74
  155. package/src/data/changelog.json +13 -0
  156. package/src/lib/agent-core.js +1 -0
  157. package/src/lib/agent-team/task-lease.js +271 -3
  158. package/src/lib/agent-team/team-adjudication.js +1501 -0
  159. package/src/lib/agent-team/team-budget.js +4 -1
  160. package/src/lib/agent-team/team-control-store.js +582 -0
  161. package/src/lib/agent-team/team-distributed-queue.js +5246 -0
  162. package/src/lib/agent-team/team-process-checkpoint.js +211 -0
  163. package/src/lib/agent-team/team-runner.js +319 -22
  164. package/src/lib/agent-team/team-worktree.js +1403 -95
  165. package/src/lib/managed-checkpoint-render.js +60 -0
  166. package/src/lib/managed-tool-checkpoint.js +194 -0
  167. package/src/lib/process-execution-broker/index.js +438 -5
  168. package/src/lib/process-execution-broker/linux-generic-bwrap-runtime.js +28 -1
  169. package/src/lib/process-execution-broker/linux-generic-bwrap.js +28 -4
  170. package/src/lib/process-execution-broker/platform-sandbox.js +92 -70
  171. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  172. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  173. package/src/lib/process-execution-broker/windows-sandbox.cs +284 -19
  174. package/src/lib/process-execution-broker/workspace-transaction.js +3556 -0
  175. package/src/lib/secure-file-identity.js +433 -0
  176. package/src/lib/turn-binding.js +160 -2
  177. package/src/lib/with-file-lock.js +140 -23
  178. package/src/repl/agent-repl.js +19 -1
  179. package/src/runtime/agent-core.js +366 -122
  180. package/src/runtime/headless-runner.js +12 -0
  181. package/src/runtime/headless-stream.js +3 -0
  182. package/src/runtime/policies/agent-policy.js +14 -0
  183. package/src/assets/web-panel/assets/MarkdownRenderer-7iWGwZ-r.js +0 -1
  184. package/src/assets/web-panel/assets/MobileProjects-COBbEOlj.js +0 -1
  185. package/src/assets/web-panel/assets/RemoteSession-oOVIv9wq.js +0 -5
  186. package/src/assets/web-panel/assets/devWarning-B4dXIJqD.js +0 -1
  187. package/src/assets/web-panel/assets/index-C-C7DaG6.js +0 -1
  188. package/src/assets/web-panel/assets/index-DkfWzWtd.js +0 -1
@@ -92,7 +92,14 @@ namespace ChainlessChain.WindowsSandbox
92
92
  private const Int32 ERROR_IO_PENDING = 997;
93
93
  private const Int32 HRESULT_FROM_WIN32_ERROR_ALREADY_EXISTS =
94
94
  unchecked((Int32)0x800700B7);
95
+ private const Int32 SecurityImpersonation = 2;
96
+ private const Int32 TokenPrimary = 1;
97
+ private const Int32 WinBuiltinAdministratorsSid = 26;
98
+ private const UInt32 SECURITY_MAX_SID_SIZE = 68;
99
+ private const UInt32 SE_PRIVILEGE_ENABLED_BY_DEFAULT = 0x00000001;
100
+ private const UInt32 SE_PRIVILEGE_ENABLED = 0x00000002;
95
101
  private const Int32 TokenPrivileges = 3;
102
+ private const Int32 TokenHasRestrictions = 21;
96
103
  private const Int32 TokenIsAppContainer = 29;
97
104
  private const Int32 TokenCapabilities = 30;
98
105
  private const Int32 TokenAppContainerSid = 31;
@@ -585,9 +592,37 @@ namespace ChainlessChain.WindowsSandbox
585
592
  IntPtr sidsToRestrict,
586
593
  out IntPtr restrictedToken);
587
594
 
588
- [DllImport("advapi32.dll")]
595
+ [DllImport("advapi32.dll", SetLastError = true)]
596
+ [return: MarshalAs(UnmanagedType.Bool)]
597
+ private static extern bool DuplicateToken(
598
+ IntPtr existingToken,
599
+ Int32 impersonationLevel,
600
+ out IntPtr duplicateToken);
601
+
602
+ [DllImport("advapi32.dll", SetLastError = true)]
603
+ [return: MarshalAs(UnmanagedType.Bool)]
604
+ private static extern bool DuplicateTokenEx(
605
+ IntPtr existingToken,
606
+ UInt32 desiredAccess,
607
+ IntPtr tokenAttributes,
608
+ Int32 impersonationLevel,
609
+ Int32 tokenType,
610
+ out IntPtr duplicateToken);
611
+
612
+ [DllImport("advapi32.dll", SetLastError = true)]
589
613
  [return: MarshalAs(UnmanagedType.Bool)]
590
- private static extern bool IsTokenRestricted(IntPtr token);
614
+ private static extern bool CheckTokenMembership(
615
+ IntPtr token,
616
+ IntPtr sidToCheck,
617
+ [MarshalAs(UnmanagedType.Bool)] out bool isMember);
618
+
619
+ [DllImport("advapi32.dll", SetLastError = true)]
620
+ [return: MarshalAs(UnmanagedType.Bool)]
621
+ private static extern bool CreateWellKnownSid(
622
+ Int32 wellKnownSidType,
623
+ IntPtr domainSid,
624
+ IntPtr sid,
625
+ ref UInt32 sidSize);
591
626
 
592
627
  [DllImport("advapi32.dll", SetLastError = true)]
593
628
  [return: MarshalAs(UnmanagedType.Bool)]
@@ -922,6 +957,184 @@ namespace ChainlessChain.WindowsSandbox
922
957
  }
923
958
  }
924
959
 
960
+ private static bool ReadTokenBoolean(
961
+ IntPtr token,
962
+ Int32 informationClass,
963
+ string description)
964
+ {
965
+ IntPtr information = IntPtr.Zero;
966
+ try
967
+ {
968
+ UInt32 informationLength;
969
+ information = ReadTokenInformation(
970
+ token,
971
+ informationClass,
972
+ out informationLength);
973
+ if (informationLength < sizeof(Byte))
974
+ throw new InvalidDataException(
975
+ "Token omitted its " + description);
976
+ return Marshal.ReadByte(information) != 0;
977
+ }
978
+ finally
979
+ {
980
+ if (information != IntPtr.Zero)
981
+ Marshal.FreeHGlobal(information);
982
+ }
983
+ }
984
+
985
+ private static bool TokenWasFiltered(IntPtr token)
986
+ {
987
+ return ReadTokenBoolean(
988
+ token,
989
+ TokenHasRestrictions,
990
+ "restriction status");
991
+ }
992
+
993
+ private static bool TokenHasUnexpectedEnabledPrivileges(IntPtr token)
994
+ {
995
+ IntPtr privilegesBuffer = IntPtr.Zero;
996
+ try
997
+ {
998
+ UInt32 informationLength;
999
+ privilegesBuffer = ReadTokenInformation(
1000
+ token,
1001
+ TokenPrivileges,
1002
+ out informationLength);
1003
+ if (informationLength < sizeof(Int32))
1004
+ throw new InvalidDataException(
1005
+ "Token omitted its privilege list");
1006
+ Int32 privilegeCount = Marshal.ReadInt32(privilegesBuffer);
1007
+ int privilegeOffset = sizeof(Int32);
1008
+ int privilegeSize = Marshal.SizeOf(
1009
+ typeof(LUID_AND_ATTRIBUTES));
1010
+ for (int index = 0; index < privilegeCount; index++)
1011
+ {
1012
+ int entryOffset = checked(
1013
+ privilegeOffset + index * privilegeSize);
1014
+ if (
1015
+ checked((UInt32)(entryOffset + privilegeSize)) >
1016
+ informationLength)
1017
+ {
1018
+ throw new InvalidDataException(
1019
+ "Token privilege list is truncated");
1020
+ }
1021
+ LUID_AND_ATTRIBUTES privilege =
1022
+ (LUID_AND_ATTRIBUTES)Marshal.PtrToStructure(
1023
+ IntPtr.Add(privilegesBuffer, entryOffset),
1024
+ typeof(LUID_AND_ATTRIBUTES));
1025
+ UInt32 privilegeNameLength = 0;
1026
+ LookupPrivilegeName(
1027
+ null,
1028
+ ref privilege.Luid,
1029
+ null,
1030
+ ref privilegeNameLength);
1031
+ if (privilegeNameLength == 0)
1032
+ ThrowLastError("LookupPrivilegeName(size)");
1033
+ StringBuilder privilegeName = new StringBuilder(
1034
+ checked((Int32)privilegeNameLength + 1));
1035
+ if (!LookupPrivilegeName(
1036
+ null,
1037
+ ref privilege.Luid,
1038
+ privilegeName,
1039
+ ref privilegeNameLength))
1040
+ {
1041
+ ThrowLastError("LookupPrivilegeName");
1042
+ }
1043
+ if (!String.Equals(
1044
+ privilegeName.ToString(),
1045
+ "SeChangeNotifyPrivilege",
1046
+ StringComparison.Ordinal) &&
1047
+ (
1048
+ privilege.Attributes &
1049
+ (
1050
+ SE_PRIVILEGE_ENABLED |
1051
+ SE_PRIVILEGE_ENABLED_BY_DEFAULT)) != 0)
1052
+ {
1053
+ return true;
1054
+ }
1055
+ }
1056
+ return false;
1057
+ }
1058
+ finally
1059
+ {
1060
+ if (privilegesBuffer != IntPtr.Zero)
1061
+ Marshal.FreeHGlobal(privilegesBuffer);
1062
+ }
1063
+ }
1064
+
1065
+ private static bool TokenIsAppContainerToken(IntPtr token)
1066
+ {
1067
+ return ReadTokenBoolean(
1068
+ token,
1069
+ TokenIsAppContainer,
1070
+ "AppContainer status");
1071
+ }
1072
+
1073
+ private static bool TokenHasEnabledAdministratorSid(IntPtr token)
1074
+ {
1075
+ if (TokenIsAppContainerToken(token))
1076
+ return false;
1077
+
1078
+ IntPtr administratorSid = IntPtr.Zero;
1079
+ IntPtr impersonationToken = IntPtr.Zero;
1080
+ try
1081
+ {
1082
+ administratorSid = Marshal.AllocHGlobal(
1083
+ checked((Int32)SECURITY_MAX_SID_SIZE));
1084
+ UInt32 administratorSidSize = SECURITY_MAX_SID_SIZE;
1085
+ if (!CreateWellKnownSid(
1086
+ WinBuiltinAdministratorsSid,
1087
+ IntPtr.Zero,
1088
+ administratorSid,
1089
+ ref administratorSidSize))
1090
+ {
1091
+ ThrowLastError("CreateWellKnownSid(Administrators)");
1092
+ }
1093
+ if (!DuplicateToken(
1094
+ token,
1095
+ SecurityImpersonation,
1096
+ out impersonationToken))
1097
+ {
1098
+ ThrowLastError("DuplicateToken");
1099
+ }
1100
+ bool isMember;
1101
+ if (!CheckTokenMembership(
1102
+ impersonationToken,
1103
+ administratorSid,
1104
+ out isMember))
1105
+ {
1106
+ ThrowLastError("CheckTokenMembership(Administrators)");
1107
+ }
1108
+ return isMember;
1109
+ }
1110
+ finally
1111
+ {
1112
+ if (impersonationToken != IntPtr.Zero)
1113
+ CloseHandle(impersonationToken);
1114
+ if (administratorSid != IntPtr.Zero)
1115
+ Marshal.FreeHGlobal(administratorSid);
1116
+ }
1117
+ }
1118
+
1119
+ private static void AssertRestrictedTokenPolicy(
1120
+ IntPtr token,
1121
+ bool disableAdministratorSids)
1122
+ {
1123
+ if (!TokenWasFiltered(token))
1124
+ throw new InvalidDataException(
1125
+ "Restricted token is not marked as filtered");
1126
+ if (TokenHasUnexpectedEnabledPrivileges(token))
1127
+ throw new InvalidDataException(
1128
+ "Restricted token retained an unexpected enabled privilege");
1129
+ if (
1130
+ disableAdministratorSids &&
1131
+ TokenHasEnabledAdministratorSid(token))
1132
+ {
1133
+ throw new InvalidDataException(
1134
+ "Restricted token retained an enabled Administrators SID");
1135
+ }
1136
+ }
1137
+
925
1138
  private static string AttestAppContainerTarget(
926
1139
  IntPtr process,
927
1140
  IntPtr expectedAppContainerSid)
@@ -3082,29 +3295,81 @@ namespace ChainlessChain.WindowsSandbox
3082
3295
  ThrowLastError("OpenProcessToken");
3083
3296
  }
3084
3297
 
3085
- UInt32 restrictedTokenFlags = DISABLE_MAX_PRIVILEGE;
3086
3298
  // The ordinary compatibility profile removes privileges while
3087
3299
  // retaining the caller's enabled SIDs so nested tools such as
3088
3300
  // Git for Windows can still create their helper processes and
3089
- // anonymous pipes. Strong profiles additionally deny enabled
3090
- // administrator SIDs with LUA_TOKEN. Re-applying LUA_TOKEN to
3091
- // an already restricted parent can fail with
3092
- // ERROR_INVALID_PARAMETER.
3093
- if (disableAdministratorSids && !IsTokenRestricted(sourceToken))
3301
+ // anonymous pipes. CreateRestrictedToken explicitly accepts an
3302
+ // already restricted ExistingToken. Apply only restrictions
3303
+ // that the current token does not already satisfy: repeating
3304
+ // DISABLE_MAX_PRIVILEGE on a nested restricted worker can fail
3305
+ // with ERROR_INVALID_PARAMETER. The zero-delta path below uses
3306
+ // an exact primary-token duplicate instead of filtering again.
3307
+ bool sourceTokenWasFiltered =
3308
+ TokenWasFiltered(sourceToken);
3309
+ bool sourceTokenHasUnexpectedEnabledPrivileges =
3310
+ TokenHasUnexpectedEnabledPrivileges(sourceToken);
3311
+ bool sourceTokenHasEnabledAdministratorSid =
3312
+ disableAdministratorSids &&
3313
+ TokenHasEnabledAdministratorSid(sourceToken);
3314
+ UInt32 restrictedTokenFlags = 0;
3315
+ if (
3316
+ !sourceTokenWasFiltered ||
3317
+ sourceTokenHasUnexpectedEnabledPrivileges)
3318
+ {
3319
+ restrictedTokenFlags |= DISABLE_MAX_PRIVILEGE;
3320
+ }
3321
+ if (
3322
+ sourceTokenHasEnabledAdministratorSid)
3323
+ {
3094
3324
  restrictedTokenFlags |= LUA_TOKEN;
3095
- if (!CreateRestrictedToken(
3096
- sourceToken,
3097
- restrictedTokenFlags,
3098
- 0,
3099
- IntPtr.Zero,
3100
- 0,
3101
- IntPtr.Zero,
3102
- 0,
3103
- IntPtr.Zero,
3104
- out restrictedToken))
3325
+ }
3326
+ // An inherited sandbox token may already carry restricting
3327
+ // SIDs. Passing empty restriction arrays back through
3328
+ // CreateRestrictedToken is not a reliable identity operation:
3329
+ // Windows can reject that zero-delta filter with
3330
+ // ERROR_INVALID_PARAMETER. Duplicate the already compliant
3331
+ // primary token instead, preserving its complete restriction
3332
+ // set. The policy assertion below remains authoritative.
3333
+ if (restrictedTokenFlags == 0)
3105
3334
  {
3106
- ThrowLastError("CreateRestrictedToken");
3335
+ if (!DuplicateTokenEx(
3336
+ sourceToken,
3337
+ tokenAccess,
3338
+ IntPtr.Zero,
3339
+ SecurityImpersonation,
3340
+ TokenPrimary,
3341
+ out restrictedToken))
3342
+ {
3343
+ ThrowLastError("DuplicateTokenEx(compliant primary)");
3344
+ }
3107
3345
  }
3346
+ else
3347
+ {
3348
+ if (!CreateRestrictedToken(
3349
+ sourceToken,
3350
+ restrictedTokenFlags,
3351
+ 0,
3352
+ IntPtr.Zero,
3353
+ 0,
3354
+ IntPtr.Zero,
3355
+ 0,
3356
+ IntPtr.Zero,
3357
+ out restrictedToken))
3358
+ {
3359
+ ThrowLastError(
3360
+ String.Format(
3361
+ CultureInfo.InvariantCulture,
3362
+ "CreateRestrictedToken(flags={0},filtered={1}," +
3363
+ "unexpectedPrivileges={2},enabledAdmin={3})",
3364
+ restrictedTokenFlags,
3365
+ sourceTokenWasFiltered,
3366
+ sourceTokenHasUnexpectedEnabledPrivileges,
3367
+ sourceTokenHasEnabledAdministratorSid));
3368
+ }
3369
+ }
3370
+ AssertRestrictedTokenPolicy(
3371
+ restrictedToken,
3372
+ disableAdministratorSids);
3108
3373
 
3109
3374
  job = CreateJobObject(IntPtr.Zero, null);
3110
3375
  if (job == IntPtr.Zero) ThrowLastError("CreateJobObject");