chainlesschain 0.162.187 → 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.
- package/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-CETaO3s8.js → AIOps-DbZft8w0.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CAe7E9TW.js → ActionButton-DoOZpwfN.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BGr2mzwO.js → Analytics-B0J0KLTW.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-BEoY-NcT.js → AppLayout-D9eIR0qq.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-DUZivCgt.js → Artifacts-BnZXEVeo.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-C3yBs68k.js → Audit-X1ce4Bjn.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-C9KwiY3O.js → BackgroundAgents-BvWR-y5v.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BoSWD_C8.js → Backup-BublSGEd.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Dp09GkxL.js → BaseInput-CR_77Hso.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-5t9d-Ja0.js → Chat-DixW52tq.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-DmVku4GH.js → ChatBubbleRenderer-DDHDpBBA.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-8QJFlkqI.js → Checkbox-CCv1C87K.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BJVFQ3lL.js → Codegen-B03Cc3dd.js} +1 -1
- package/src/assets/web-panel/assets/{Col-6hdLD0oB.js → Col-CA06-6pU.js} +1 -1
- package/src/assets/web-panel/assets/{Community-B8opo0uY.js → Community-Bj881J52.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-Dv8HudiN.js → Compact-UZLTPoaL.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DhxuCS5N.js → Compliance-kGwzRb_0.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-Dggy6VIL.js → Cowork-KundoYM8.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-DSmDqJTT.js → Cron-BYZyoqDe.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-7bZq0j5f.js → Crosschain-BhrrppBX.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BWY4kh-H.js → DID-CdC6EguZ.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-bOzPZxlu.js → Dashboard-CcQx3J4y.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BTFJHqQu.js → Dropdown-BpijtEzQ.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BC3MOdtT.js → EmailListRenderer-DfZjeZTe.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CFHAdTTY.js → FamilyGuardDashboard-BFYSf69C.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DZ_4aF_n.js → Federation-Okdi3pJm.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BZje6UTj.js → FormItemContext-mH-HebKW.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-D7QfCvjN.js → GenericCardRenderer-xivV69x7.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DuG7qANG.js → Git-1rh_YBwg.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BDmYAgTh.js → Governance-eAXkNxdY.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DSXAfc1Q.js → Inference-CS6dMVTN.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DusleniP.js → KnowledgeGraph-Bq_TnkvD.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CpImmA8p.js → Logs-KchHtiHt.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-BZ6LJBkk.js → MarkdownRenderer-TabqHW9B.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-DXS8CXkE.js → Marketplace-CsmGcX5X.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-D151UfUI.js → McpTools-BaPFnnyz.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-DKDxnoA1.js → Memory-2m-sUUf7.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BFZ95iKM.js → MobileBridge-D5nVZBRu.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CDAR-grF.js → MobileProjects-Bo8MLZvT.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-OGJ95xJs.js → Mtc-3GDvamGa.js} +6 -6
- package/src/assets/web-panel/assets/{MtcAudit-BmGTo1XC.js → MtcAudit-D2zGuZCH.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-XumJRqOa.js → Multisig-BBVQ4t6t.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DHhhRZed.js → NLProgramming-BIOCyOGp.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-B9rGxNNr.js → Notes-DVwBGpzc.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DClLbMYV.js → NotificationSettings-BDnHfIfX.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-I8OohT7N.js → OrderTableRenderer-C7Ek20ag.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-M6WzaYVa.js → Organization-D3SRKaa7.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Cb3B5KtM.js → Overflow-C2B8ahyn.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BGk57kya.js → P2P-2iwQzG65.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CXcKyPqK.js → PdhVaultBrowser-CoPiWqMN.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-hsfJ-Y0e.js → Permissions-yV5XNXo5.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BSBii4js.js → PersonalDataHub-uCDJhMUF.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-BNw52rey.js → Pipeline-hN7ucMOA.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DUpfue4E.js → Privacy-CgU0ptN4.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-C68NsP3h.js → ProjectInit-CfYPiT6j.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BJ2It9v4.js → ProjectSettings-B0A2C4nw.js} +2 -2
- package/src/assets/web-panel/assets/Projects-BE5C0ajn.js +1 -0
- package/src/assets/web-panel/assets/{Providers-EnU4VWwS.js → Providers-CstQPf8W.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-BRt5-B_I.js → QrScannerModal-Co3z_ynk.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Jd5L9UL2.js → QuickAsk-DMTS6pQ6.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BNDhoVIu.js → Recommend-ETw4odUa.js} +1 -1
- package/src/assets/web-panel/assets/RemoteSession-B0rkE09d.js +5 -0
- package/src/assets/web-panel/assets/{Reputation-D1wQPUNv.js → Reputation-BTVqQgKq.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DnjRegul.js → Row-CBKKwwtO.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-C_T4I-nF.js → RssFeed-BHUQ438I.js} +2 -2
- package/src/assets/web-panel/assets/{Search-C4lrxlLh.js → Search-B4NqeUsF.js} +1 -1
- package/src/assets/web-panel/assets/{Security-ByYT-VzP.js → Security-BRjoYG5_.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BHpyEqB5.js → Services-CxQzu3p3.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-C0I23vG-.js → Skeleton-BKzwwmWO.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DGZXz22K.js → Skills-DrsFcgth.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DL_urP9A.js → Sla-D21tmXCH.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-6x-hUNQ_.js → SpeechSettings-CjyjLfp8.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-Crk5TCXq.js → SyncSettings-Cu45-tnx.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-rZGq5PZs.js → Tasks-oMcILYOj.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DT5el8Q8.js → Templates-Bh-Zcr5R.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-mlgeyMK8.js → Tenant-68ns63aI.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-C8HEA-lM.js → Terminal-BLJkFykE.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DvlqBayB.js → TimelineRenderer-xcrJLq-O.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-C7lDcNmT.js → Tokens-C6PpFJtf.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-CM8nCnIJ.js → Trigger-BaKA7tdM.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BQDLUQ9x.js → Trust-BzhA57Jc.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CVqM0OFE.js → UkeySign-4_U3JkIR.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BvAcQpzT.js → VideoEditing-162AANxX.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-zFVFaAZ2.js → Wallet-B1viuql_.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-Cc522ums.js → WebAuthn-ZVWazhCy.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-Bg_wxpDo.js → WorkflowEditor-tzdyUk-1.js} +1 -1
- package/src/assets/web-panel/assets/{chat-jg0QwC8K.js → chat-DmrHNuwq.js} +1 -1
- package/src/assets/web-panel/assets/{colors-ALzYz1gO.js → colors-DAJ_M-PK.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DXHYUoqi.js → compact-item-uIzmYwLs.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BsGsBM5m.js → createContext-D_ZmuLwb.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DIrncrV1.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BccMLzxA.js → hasIn-CDt_shTL.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cg9cOVe9.js → index-BAvSmJXW.js} +1 -1
- package/src/assets/web-panel/assets/{index-BTTeAiOP.js → index-BDF6EQBs.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3k3ZwkQ.js → index-BHvlm0In.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQ1ORdp-.js → index-BRa4kJ_S.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcJzphrP.js → index-BTCXf1t-.js} +1 -1
- package/src/assets/web-panel/assets/{index-rIy96PeM.js → index-Bbxjfstq.js} +1 -1
- package/src/assets/web-panel/assets/{index-CSFESurl.js → index-Bx4d6c1k.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cmg_Npx5.js → index-ByzGvpR9.js} +1 -1
- package/src/assets/web-panel/assets/{index-CahDve8M.js → index-C16fYKFD.js} +1 -1
- package/src/assets/web-panel/assets/{index-2VstcImq.js → index-C5WcdJH2.js} +3 -3
- package/src/assets/web-panel/assets/{index-C3Rf8wIM.js → index-CG0lY4h3.js} +1 -1
- package/src/assets/web-panel/assets/{index-uzykuL_R.js → index-CKyd472S.js} +1 -1
- package/src/assets/web-panel/assets/{index-CBVIFX-x.js → index-CaelyMgF.js} +1 -1
- package/src/assets/web-panel/assets/{index-TeCof1s3.js → index-CbD_WW_6.js} +1 -1
- package/src/assets/web-panel/assets/{index-BfF0OGKU.js → index-CcZ9xJI9.js} +1 -1
- package/src/assets/web-panel/assets/{index-oWltafBn.js → index-CeUpKjvi.js} +1 -1
- package/src/assets/web-panel/assets/{index-CWLWBgfe.js → index-Cvak6Oe2.js} +1 -1
- package/src/assets/web-panel/assets/{index-C0AbXsDy.js → index-CzXqvMuP.js} +1 -1
- package/src/assets/web-panel/assets/index-D-Swwqld.js +1 -0
- package/src/assets/web-panel/assets/{index-BfV8RDlg.js → index-D4n1lGTB.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dxqiu9-F.js → index-D9OE8B3d.js} +1 -1
- package/src/assets/web-panel/assets/{index-BdCmJ_bG.js → index-DBFmcaCQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DgjQ-kdT.js → index-DdUMcwRB.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBbbr1YB.js → index-DeGBoLQA.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dmk7dD-T.js → index-DfSSy9uy.js} +1 -1
- package/src/assets/web-panel/assets/{index-JS2LXdd0.js → index-DqDSF2RW.js} +1 -1
- package/src/assets/web-panel/assets/{index-D9oV2iRR.js → index-DvFhhe6r.js} +1 -1
- package/src/assets/web-panel/assets/{index-BvsII10i.js → index-DwfvPe-j.js} +1 -1
- package/src/assets/web-panel/assets/index-FMZAMKy8.js +1 -0
- package/src/assets/web-panel/assets/{index-CrZHUsOZ.js → index-FyplHuNt.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLzPzN75.js → index-GcKOHD_c.js} +1 -1
- package/src/assets/web-panel/assets/{index-koT8Q86Z.js → index-OzTxFIJP.js} +1 -1
- package/src/assets/web-panel/assets/{index-08diKcTm.js → index-QsgfSZrV.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJg6Wsjc.js → index-Z8P4BexE.js} +1 -1
- package/src/assets/web-panel/assets/{index-srqW5_-X.js → index-clSX4PEc.js} +1 -1
- package/src/assets/web-panel/assets/{index-mIQUoUx1.js → index-ifxmu8SY.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cz_s25m3.js → index-rS3gl_68.js} +1 -1
- package/src/assets/web-panel/assets/{index-UQXedWQz.js → index-rXdwUeE3.js} +1 -1
- package/src/assets/web-panel/assets/{index-rcwgNMc0.js → index-saf3VNeP.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-xafkqrW3.js → initDefaultProps-pmfaD-aK.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BrtyQXLk.js → motion-CaQ2CpYF.js} +1 -1
- package/src/assets/web-panel/assets/{move-BunUyg59.js → move-CkKTqNbI.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BPwjBeuE.js → mtc-parser-Dd4xsgRI.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BpyqZlNO.js → omit-BFuA5YEs.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DDrV0XjE.js → pickAttrs-DDfxOAJc.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-1A18Pcl2.js → placementArrow-Be595JCp.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-B8Fnlmso.js → responsiveObserve-7byljUM3.js} +1 -1
- package/src/assets/web-panel/assets/{slide-x-Fwb2Zm.js → slide-CTWfOTaY.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-aAG5yJl_.js → statusUtils-CNZOuIxM.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BRQSTMRL.js → styleChecker-DwOcBV78.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-D5X_KozY.js → useFlexGapSupport-B6MNwAO9.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DN_YIjP-.js → useFs-CzyQjH9r.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BizxAvjw.js → usePersonalDataHub-Dxh3KiVA.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-B5oAxN93.js → vnode-DVfZiS5N.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DJhvyzKv.js → zoom-BYme7fbY.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +22 -0
- package/src/commands/auto-mode.js +47 -0
- package/src/commands/checkpoint-managed.js +1059 -0
- package/src/commands/checkpoint.js +3 -0
- package/src/commands/team-distributed.js +3324 -0
- package/src/commands/team.js +1130 -74
- package/src/data/auto-mode-safety-eval-v1.json +3294 -0
- package/src/data/changelog.json +26 -0
- package/src/lib/agent-core.js +1 -0
- package/src/lib/agent-team/task-lease.js +271 -3
- package/src/lib/agent-team/team-adjudication.js +1501 -0
- package/src/lib/agent-team/team-budget.js +4 -1
- package/src/lib/agent-team/team-control-store.js +582 -0
- package/src/lib/agent-team/team-distributed-queue.js +5246 -0
- package/src/lib/agent-team/team-process-checkpoint.js +211 -0
- package/src/lib/agent-team/team-runner.js +319 -22
- package/src/lib/agent-team/team-worktree.js +1403 -95
- package/src/lib/auto-mode-safety-classifier.js +2034 -0
- package/src/lib/auto-mode-safety-eval.js +1022 -0
- package/src/lib/managed-checkpoint-render.js +60 -0
- package/src/lib/managed-tool-checkpoint.js +194 -0
- package/src/lib/process-execution-broker/index.js +438 -5
- package/src/lib/process-execution-broker/linux-generic-bwrap-runtime.js +28 -1
- package/src/lib/process-execution-broker/linux-generic-bwrap.js +28 -4
- package/src/lib/process-execution-broker/platform-sandbox.js +92 -70
- package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
- package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
- package/src/lib/process-execution-broker/windows-sandbox.cs +284 -19
- package/src/lib/process-execution-broker/workspace-transaction.js +3556 -0
- package/src/lib/secure-file-identity.js +433 -0
- package/src/lib/turn-binding.js +160 -2
- package/src/lib/with-file-lock.js +140 -23
- package/src/repl/agent-repl.js +19 -1
- package/src/runtime/agent-core.js +366 -122
- package/src/runtime/headless-runner.js +12 -0
- package/src/runtime/headless-stream.js +3 -0
- package/src/runtime/policies/agent-policy.js +14 -0
- package/src/assets/web-panel/assets/Projects-D2FHLUa-.js +0 -1
- package/src/assets/web-panel/assets/RemoteSession-BII41Mel.js +0 -5
- package/src/assets/web-panel/assets/devWarning-Dy1GJA4S.js +0 -1
- package/src/assets/web-panel/assets/index-8zbMbbuf.js +0 -1
- package/src/assets/web-panel/assets/index-C97f71oi.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
|
|
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.
|
|
3090
|
-
//
|
|
3091
|
-
//
|
|
3092
|
-
//
|
|
3093
|
-
|
|
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
|
-
|
|
3096
|
-
|
|
3097
|
-
|
|
3098
|
-
|
|
3099
|
-
|
|
3100
|
-
|
|
3101
|
-
|
|
3102
|
-
|
|
3103
|
-
|
|
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
|
-
|
|
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");
|