From 3b355e197f8ee0c756efcb024324b0de32916ec6 Mon Sep 17 00:00:00 2001 From: Ylian Saint-Hilaire Date: Tue, 20 Oct 2020 15:15:56 -0700 Subject: [PATCH] Added CCM activation support. --- agents/MeshCmd-signed.exe | Bin 4375736 -> 4376224 bytes agents/MeshCmd64-signed.exe | Bin 3991736 -> 3992224 bytes amtmanager.js | 108 ++++++++++++++++++++++++++++++++++-- views/default.handlebars | 6 +- 4 files changed, 105 insertions(+), 9 deletions(-) diff --git a/agents/MeshCmd-signed.exe b/agents/MeshCmd-signed.exe index 5a7739c612f25d032e8f7e5e55f62ca5934f6f5e..a70ebd616f122b42dda1c5cc14a7b9d961b5204b 100644 GIT binary patch delta 1526 zcmX}mc{tR090%~3F-AjXlzWtGW^#lX!iMmhA4yc&q9R#sYg$ZUQIn(55-W6!>Pr+I zIw(gQBRVC7Ddie%x*VC5(dOt<`)QwN_wzij&-3}?{k)$~ZDtm!I46r#DI_Y<{5*0K ziLN9T6fgk`u)zXg2F!s4umlT%6|e?2fCIR|R#Hc_^J&jezHbK>0ej#8 z9KjD@F>nITzy&M;uD}hr15BcPpZB~06{+D=$(w_CBn53ahU+1lcuX7h#bG+gItHVm z&=ib}I%KfiV=x0$Jh+gIM2mP7^d^%>MP&%5p@swq8;@Yh=&T5HLHn4zRmgaPM@HNf zOdX}jc*=AI2qOd zhN((I^KcPy)_;|f7x_3_lk|K9&ANo|;nrUeGb}bM#ROi<4EZeAJ)fB!*fleLr&Rjd z?JQ0hQCE>%DVZNvg7~qYHZ?8NAxf@Z!l&nOha+=dRjA+TaJH0&D7?NYeESQM{A}t{ zA%#f!+Dpoz;MrUWtX^gEds5MH+N6&BKsiM$d9!FZ1(91}cZ-b)Vks4&lXJ&*B zo~;$ic^}L5x`$ufE*V_P^S|-ssJE}DOPZGdQ}==G1kWDDez|NTH@%88ny7x(*l+y} zLI0zuKsqN>;4hi@$ozEAEL*kyr1q-V7s+yBkc}Yk7M$W{>`q zx3pe#g=XpLS5hgV5v1adV4pQlf@7TPg}OY4gK>L3beHHVaYRX}718+vFQ}PG+`F}= z3j~a>ig`Z${J!z!ZW{R}UT-vA{PqhY7*UkL^SZg>g{&4mI`d`W)c&r)<%AZ!70%RK zxc&i0GjmmI?pSopHchL;M$24S@l$S7MMk6#HE7Fid_rXFWNT;d7{qm_P%YEF)2G#m zRI;rdnR`tdS=G7N-itz5ny{>LV0xJ)$E3V*+uq$4!qLvAq5ygZVZFmwYOR=gAa%_> zTMe%I{{=*%GJ*U%iNK#-xKBB@UU)p6V9`@+k?QHpapTKOyX~a~%}!nJr@TWSY!r!u zxM%FAbW~{WX`~N%k(+voH@xayP@R@ML2V8Tejml^C>&rpJr9oV(vKWICrvzBJjuqI zE>`vx;_T!|2KRDr+lk;7S)W{Pt9kmt%*WSlCdPlBmIs=7ZsZMqD zI;?JfS1q&NaH`boX|T9q%(lvg8zf5TbsbyNpDP|6t3?V$cE*sEpk^q?WEJ(PjAkKb z5Ste-4^A`APL3$_Ikow(x7sV|Nm}Q6j!R!0vbo?pXr%LX$6EbOUwp==GdG{&7f*54 zlLb@bD@&xT%UDsCW`S=w`}zsqt!S}nQ}?=nm`Tm!rgH869TJXEG^u~HR3P%K8CKk7 zm5#8QZoM~&-ny!FwZ_X8jELLq*%Ysas_Lx|*+G1##;|H)MUKaiTFrIIYfS=$YaMle zzB%LZ^r~=I`LoaOABrwH{-M&!^5{<+8hvu)dX=<5P`0j3-u^5p=hIw4s@|b3mHA5P zImcRk%VgVk(#m7cT)f8_`dN(~Hp6T=tb4PJA7!nuFWR#&(@xlO-l$=YintnUTQqmq z)kw-jUSR2Zmk4=_!R*$M&fO=Q5PQH=EjFUOGs4L=J`sEOtD>1*>elm;_4q+Rbe*B$ Ui7vrh$45K6FSmDu5dNKi0IaH?v;Y7A delta 1371 zcmX}kdpOez9LI6Hn6b?@3?o@Ckqo&FYyFZm&Qyrg9&}1>sT6wZsCH`NDY`nxuQrzy zMPjBzBQ?Sz+Uc}P3h9)_irhP=%lUTx=<__U|31(A!iijLtj~JuR(%H5JLc|ayX0Q#g z)(6prg@`H2MG>7Jr)V@mgqWac2Ak86Cqz6jSZ-LueGy`7gdO;XPShZW8K3PcYHm(g zmJzlD((`0qdaaSAa^joaDbD8yN5?aZXGv7KU#-6GIiqIje$kqw$c9oeGH1Yukj7bA zv`wLZzAOy0CRY?x5%q4wxk22JT;n3SOV6(17kO5YPY)y8X`ydA6OSU5k#ACvO8<;9SBFGe+I zbF}TU7t4Mt*LO^=3cqJa(~0Ll*n?(}wCWXz%JyZ;l4xeofc#UL;$_r`chZ@)_B%Rw zMV1Kj)CSV&WgF5o+@A@#{SgFxvh4CcO+saBO{^E5=UdTQ8maZ`$wv9Xg11h8s4gyQ z@vP#;M$4t?14W|vktZM4EO%2r3MPf_IC@}bma?M8wfdbIziYbWX?Z(#{tz16hD`Gr z9&YXo?@f#q1Z~IcpzJvcMjP+yhG$&6#Zu!d%LIw4r0@c-XKaPfkoUQc&EwGh$H@>Sk(aeQ9Ru)sB(~<#fn}@QguY zsZ*!rm*6XBwS4Qsm7A|GyFa7dAz)HuG3-`U0RgF zr#DWBE)S_gW7T!y=j@rST^VUMEIZC;Lgo!i?d)s4>Bm31x)ka<3%1&i7N$I^ zaE|Jnq%G;*SNws`eq?HM(7kH-=i~`RKGrEY+pWsSHcrVXIrh`Wb(5dtukB_ZB!0spKB=H<>1BQnWi0-)y_ygD#%FTNdzQs(n?rzc}h- zVrZLV=Xk_|k0Iu71?l7J6HoUCniU;p%hqHq(6-F&IK&A2DVSQ8OO}saDBj(-M_8TJ h#m`~AX5mVZ)kjr5GoBNx?Go%u&BxuQhg2H>?>{KQW{Lm+ diff --git a/agents/MeshCmd64-signed.exe b/agents/MeshCmd64-signed.exe index ef1860f317aa9850d07835e79531690709115b2c..a0a5e79d24932619b013a2ad9fd59c137e3e84d9 100644 GIT binary patch delta 1496 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 diff --git a/amtmanager.js b/amtmanager.js index 9d8b7fa1..5caacfd0 100644 --- a/amtmanager.js +++ b/amtmanager.js @@ -71,6 +71,9 @@ module.exports.CreateAmtManager = function(parent) { var i = devices.indexOf(dev); if (i == -1) return false; + // Remove from task limiter if needed + if (dev.taskid != null) { obj.parent.taskLimiter.completed(dev.taskid); delete dev.taskLimiter; } + // Clean up this device if (dev.amtstack != null) { dev.amtstack.wsman.comm.FailAllError = 999; delete dev.amtstack; } // Disconnect any active connections. if (dev.polltimer != null) { clearInterval(dev.polltimer); delete dev.polltimer; } @@ -86,16 +89,17 @@ module.exports.CreateAmtManager = function(parent) { // Remove all Intel AMT devices for a given nodeid function removeDevice(nodeid) { - // Remove from task limiter if needed - if (dev.taskid != null) { obj.parent.taskLimiter.completed(dev.taskid); delete dev.taskLimiter; } - // Find the devices in the list var devices = obj.amtDevices[nodeid]; if (devices == null) return false; for (var i in devices) { - // Clean up this device var dev = devices[i]; + + // Remove from task limiter if needed + if (dev.taskid != null) { obj.parent.taskLimiter.completed(dev.taskid); delete dev.taskLimiter; } + + // Clean up this device if (dev.amtstack != null) { dev.amtstack.wsman.comm.FailAllError = 999; delete dev.amtstack; } // Disconnect any active connections. if (dev.polltimer != null) { clearInterval(dev.polltimer); delete dev.polltimer; } } @@ -230,6 +234,12 @@ module.exports.CreateAmtManager = function(parent) { function attemptInitialContact(dev) { parent.debug('amt', "Attempt Initial Contact", dev.name, dev.connType); + if ((dev.connType == 2) && (dev.mpsConnection != null) && (dev.mpsConnection.tag != null) && (dev.mpsConnection.tag.meiState != null) && (dev.mpsConnection.tag.meiState.ProvisioningState !== 2)) { + // This Intel AMT device is not activated, we need to work on activating it. + activateIntelAmt(dev); + return; + } + if ((dev.acctry == null) && ((typeof dev.intelamt.user != 'string') || (typeof dev.intelamt.pass != 'string'))) { if ((obj.amtAdminAccounts[dev.domainid] != null) && (obj.amtAdminAccounts[dev.domainid].length > 0)) { dev.acctry = 0; } else { removeAmtDevice(dev); return; } } @@ -435,6 +445,7 @@ module.exports.CreateAmtManager = function(parent) { if (dev.aquired.pass && (typeof dev.aquired.pass == 'string') && (dev.aquired.pass != device.intelamt.pass)) { change = 1; log = 1; device.intelamt.pass = dev.aquired.pass; changes.push('AMT pass'); } if (dev.aquired.realm && (typeof dev.aquired.realm == 'string') && (dev.aquired.realm != device.intelamt.realm)) { change = 1; log = 1; device.intelamt.realm = dev.aquired.realm; changes.push('AMT realm'); } if (dev.aquired.hash && (typeof dev.aquired.hash == 'string') && (dev.aquired.hash != device.intelamt.hash)) { change = 1; log = 1; device.intelamt.hash = dev.aquired.hash; changes.push('AMT hash'); } + if (dev.aquired.tls && (typeof dev.aquired.tls == 'number') && (dev.aquired.tls != device.intelamt.tls)) { change = 1; log = 1; device.intelamt.tls = dev.aquired.tls; changes.push('AMT TLS'); } if (device.intelamt.state != 2) { change = 1; log = 1; device.intelamt.state = 2; changes.push('AMT state'); } // Update Intel AMT flags if needed @@ -672,6 +683,11 @@ module.exports.CreateAmtManager = function(parent) { if (isAmtDeviceValid(dev) == false) return; // Device no longer exists, ignore this request. if (status != 200) { dev.consoleMsg("Failed to generate a key pair (" + status + ")."); removeAmtDevice(dev); return; } + // Check that we get a key pair reference + var x = null; + try { x = responses.Body['KeyPair']['ReferenceParameters']['SelectorSet']['Selector']['Value']; } catch (ex) { } + if (x == null) { dev.consoleMsg("Unable to get key pair reference."); removeAmtDevice(dev); return; } + // Get the new key pair dev.amtstack.Enum('AMT_PublicPrivateKeyPair', function (stack, name, responses, status, tag) { const dev = stack.dev; @@ -700,6 +716,12 @@ module.exports.CreateAmtManager = function(parent) { // Place the resulting signed certificate back into AMT var pem = obj.parent.certificateOperations.forge.pki.certificateToPem(cert).replace(/(\r\n|\n|\r)/gm, ''); + + // Set the certificate finderprint (SHA1) + var md = obj.parent.certificateOperations.forge.md.sha1.create(); + md.update(obj.parent.certificateOperations.forge.asn1.toDer(obj.parent.certificateOperations.forge.pki.certificateToAsn1(cert)).getBytes()); + dev.aquired.xhash = md.digest().toHex(); + dev.amtstack.AMT_PublicKeyManagementService_AddCertificate(pem.substring(27, pem.length - 25), function (stack, name, responses, status) { const dev = stack.dev; if (isAmtDeviceValid(dev) == false) return; // Device no longer exists, ignore this request. @@ -760,6 +782,13 @@ module.exports.CreateAmtManager = function(parent) { if (isAmtDeviceValid(dev) == false) return; // Device no longer exists, ignore this request. if (status != 200) { dev.consoleMsg("Failed perform commit (" + status + ")."); removeAmtDevice(dev); return; } dev.consoleMsg("Enabled TLS"); + + // Update device in the database + dev.aquired.tls = 1; + dev.aquired.hash = dev.aquired.xhash; + delete dev.aquired.xhash; + UpdateDevice(dev); + // TODO: Switch our communications to TLS (Restart our management of this node) devTaskCompleted(dev); }); @@ -1159,6 +1188,70 @@ module.exports.CreateAmtManager = function(parent) { devTaskCompleted(dev); } + + // + // Intel AMT Activation + // + + function activateIntelAmt(dev) { + // Find the Intel AMT policy + const mesh = parent.webserver.meshes[dev.meshid]; + if (mesh == null) { dev.consoleMsg("Unable to find device group."); removeAmtDevice(dev); return; } + var amtPolicy = 0; // 0 = Do nothing, 1 = Deactivate CCM, 2 = CCM, 3 = ACM + if (mesh.amt != null) { if (mesh.amt.type) { amtPolicy = mesh.amt.type; } } + if ((typeof dev.mpsConnection.tag.meiState.OsAdmin != 'object') || (typeof dev.mpsConnection.tag.meiState.OsAdmin.user != 'string') || (typeof dev.mpsConnection.tag.meiState.OsAdmin.pass != 'string')) { amtPolicy = 0; } + if (amtPolicy == 0) { removeAmtDevice(dev); return; } // Do nothing, we should not have gotten this CIRA-LMS connection. + if (amtPolicy == 2) { activateIntelAmtCcm(dev, mesh.amt.password); } + } + + function activateIntelAmtCcm(dev, password) { + console.log('Intel AMT CCM Activation Required: ' + dev.name, dev.nodeid); + if ((password == null) || (password == '')) { password = getRandomAmtPassword(); } + dev.temp = { pass: password }; + + // Setup the WSMAN stack, no TLS + var comm = CreateWsmanComm(dev.nodeid, 16992, dev.mpsConnection.tag.meiState.OsAdmin.user, dev.mpsConnection.tag.meiState.OsAdmin.pass, 0, null, dev.mpsConnection); // No TLS + var wsstack = WsmanStackCreateService(comm); + dev.amtstack = AmtStackCreateService(wsstack); + dev.amtstack.dev = dev; + dev.amtstack.BatchEnum(null, ['*AMT_GeneralSettings', '*IPS_HostBasedSetupService'], activateIntelAmtCcmEx1); + } + + function activateIntelAmtCcmEx1(stack, name, responses, status) { + const dev = stack.dev; + if (isAmtDeviceValid(dev) == false) return; // Device no longer exists, ignore this request. + if (status != 200) { dev.consoleMsg("Failed to get Intel AMT state."); removeAmtDevice(dev); return; } + if (responses['IPS_HostBasedSetupService'].response['AllowedControlModes'].length != 2) { dev.consoleMsg("Client control mode activation not allowed."); removeAmtDevice(dev); return; } + dev.amtstack.IPS_HostBasedSetupService_Setup(2, hex_md5('admin:' + responses['AMT_GeneralSettings'].response['DigestRealm'] + ':' + dev.temp.pass).substring(0, 32), null, null, null, null, activateIntelAmtCcmEx2); + } + + function activateIntelAmtCcmEx2(stack, name, responses, status) { + const dev = stack.dev; + if (isAmtDeviceValid(dev) == false) return; // Device no longer exists, ignore this request. + if (status != 200) { dev.consoleMsg("Failed to activate Intel AMT to CCM."); removeAmtDevice(dev); return; } + obj.parent.mpsserver.SendJsonControl(dev.mpsConnection, { action: 'mestate' }); // Request an MEI state refresh + + // Update the device + dev.aquired = {}; + dev.aquired.controlMode = 1; // 1 = CCM, 2 = ACM + var verSplit = dev.amtstack.wsman.comm.amtVersion.split('.'); + if (verSplit.length >= 3) { dev.aquired.version = verSplit[0] + '.' + verSplit[1] + '.' + verSplit[2]; dev.aquired.majorver = parseInt(verSplit[0]); dev.aquired.minorver = parseInt(verSplit[1]); } + dev.aquired.realm = dev.amtstack.wsman.comm.digestRealm; + dev.aquired.user = 'admin'; + dev.aquired.pass = dev.temp.pass; + dev.aquired.lastContact = Date.now(); + dev.aquired.tls = 0; + UpdateDevice(dev); + + // Success, switch to managing this device + dev.consoleMsg("Succesfully activated Intel AMT in CCM mode."); + + // Wait 8 seconds before attempting to manage this device in CCM + var f = function doManage() { if (isAmtDeviceValid(dev)) { attemptInitialContact(doManage.dev); } } + f.dev = dev; + setTimeout(f, 8000); + } + // // General Methods // @@ -1190,6 +1283,13 @@ module.exports.CreateAmtManager = function(parent) { } } + // Generate a random Intel AMT password + function checkAmtPassword(p) { return (p.length > 7) && (/\d/.test(p)) && (/[a-z]/.test(p)) && (/[A-Z]/.test(p)) && (/\W/.test(p)); } + function getRandomAmtPassword() { var p; do { p = Buffer.from(obj.crypto.randomBytes(9), 'binary').toString('base64').split('/').join('@'); } while (checkAmtPassword(p) == false); return p; } + function getRandomPassword() { return Buffer.from(obj.crypto.randomBytes(9), 'binary').toString('base64').split('/').join('@'); } + function getRandomLowerCase(len) { var r = '', random = obj.crypto.randomBytes(len); for (var i = 0; i < len; i++) { r += String.fromCharCode(97 + (random[i] % 26)); } return r; } + + function hex_md5(str) { return obj.parent.crypto.createHash('md5').update(str).digest('hex'); } function Clone(v) { return JSON.parse(JSON.stringify(v)); } function MakeToArray(v) { if (!v || v == null || typeof v == 'object') return v; return [v]; } function getItem(x, y, z) { for (var i in x) { if (x[i][y] == z) return x[i]; } return null; } diff --git a/views/default.handlebars b/views/default.handlebars index 6b387941..b9bfc1d0 100644 --- a/views/default.handlebars +++ b/views/default.handlebars @@ -9571,11 +9571,7 @@ if (xxdialogMode) return; var x = '', acmoption = ''; if ((features & 0x100000) != 0) { acmoption = ''; } - if (currentMesh.mtype == 1) { - x += addHtmlValue("Type", ''); - } else { - x += addHtmlValue("Type", ''); - } + x += addHtmlValue("Type", ''); x += '
'; setDialogMode(2, "Intel® AMT Policy", 3, p20editMeshAmtEx, x); if (currentMesh.amt) { Q('dp20amtpolicy').value = currentMesh.amt.type; }