<div class="xblock xblock-public_view xblock-public_view-vertical" data-course-id="course-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1" data-init="VerticalStudentView" data-runtime-class="LmsRuntime" data-runtime-version="1" data-block-type="vertical" data-usage-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@vertical+block@d85c92a5dac94000ae7c1d69d7d994dc" data-request-token="38fd80f6033b11efaa280242ac12000b" data-graded="True" data-has-score="False">
<div class="vert-mod">
<div class="vert vert-0" data-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@video+block@723568534fd74019a45694368bc3c320">
<div class="xblock xblock-public_view xblock-public_view-video xmodule_display xmodule_VideoBlock" data-course-id="course-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1" data-init="XBlockToXModuleShim" data-runtime-class="LmsRuntime" data-runtime-version="1" data-block-type="video" data-usage-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@video+block@723568534fd74019a45694368bc3c320" data-request-token="38fd80f6033b11efaa280242ac12000b" data-graded="True" data-has-score="False">
<script type="json/xblock-args" class="xblock-json-init-args">
{"xmodule-type": "Video"}
</script>
<h3 class="hd hd-2">Video</h3>
<div
id="video_723568534fd74019a45694368bc3c320"
class="video closed"
data-metadata='{"autoAdvance": false, "autohideHtml5": false, "autoplay": false, "captionDataDir": null, "completionEnabled": false, "completionPercentage": 0.95, "duration": 0.0, "end": 0.0, "generalSpeed": 1.0, "lmsRootURL": "https://p.ost2.fyi", "poster": null, "prioritizeHls": false, "publishCompletionUrl": "/courses/course-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1/xblock/block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@video+block@723568534fd74019a45694368bc3c320/handler/publish_completion", "recordedYoutubeIsAvailable": true, "savedVideoPosition": 0.0, "saveStateEnabled": false, "saveStateUrl": "/courses/course-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1/xblock/block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@video+block@723568534fd74019a45694368bc3c320/handler/xmodule_handler/save_user_state", "showCaptions": "false", "sources": [], "speed": null, "start": 0.0, "streams": "1.00:PwvKQQTpluk", "transcriptAvailableTranslationsUrl": "/courses/course-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1/xblock/block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@video+block@723568534fd74019a45694368bc3c320/handler/transcript/available_translations", "transcriptLanguage": "en", "transcriptLanguages": {"en": "English"}, "transcriptTranslationUrl": "/courses/course-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1/xblock/block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@video+block@723568534fd74019a45694368bc3c320/handler/transcript/translation/__lang__", "ytApiUrl": "https://www.youtube.com/iframe_api", "ytMetadataEndpoint": "", "ytTestTimeout": 1500}'
data-bumper-metadata='null'
data-autoadvance-enabled="False"
data-poster='null'
tabindex="-1"
>
<div class="focus_grabber first"></div>
<div class="tc-wrapper">
<div class="video-wrapper">
<span tabindex="0" class="spinner" aria-hidden="false" aria-label="Loading video player"></span>
<span tabindex="-1" class="btn-play fa fa-youtube-play fa-2x is-hidden" aria-hidden="true" aria-label="Play video"></span>
<div class="video-player-pre"></div>
<div class="video-player">
<div id="723568534fd74019a45694368bc3c320"></div>
<h4 class="hd hd-4 video-error is-hidden">No playable video sources found.</h4>
<h4 class="hd hd-4 video-hls-error is-hidden">
Your browser does not support this video format. Try using a different browser.
</h4>
</div>
<div class="video-player-post"></div>
<div class="closed-captions"></div>
<div class="video-controls is-hidden">
<div>
<div class="vcr"><div class="vidtime">0:00 / 0:00</div></div>
<div class="secondary-controls"></div>
</div>
</div>
</div>
</div>
<div class="focus_grabber last"></div>
</div>
</div>
</div>
<div class="vert vert-1" data-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@done+block@e489a8af0215439985be5a5ec5bca03c">
<div class="xblock xblock-public_view xblock-public_view-done" data-course-id="course-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1" data-block-type="done" data-usage-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@done+block@e489a8af0215439985be5a5ec5bca03c" data-request-token="38fd80f6033b11efaa280242ac12000b" data-graded="True" data-has-score="True">
<div class="page-banner"><div class="alert alert-warning"><span class="icon icon-alert fa fa fa-warning" aria-hidden="true"></span><div class="message-content">Completion is only accessible to enrolled learners. Sign in or register, and enroll in this course to view it.</div></div></div>
</div>
</div>
<div class="vert vert-2" data-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@discussion+block@a5e9159b4ffc4ac485379010f2715256">
<div class="xblock xblock-public_view xblock-public_view-discussion" data-course-id="course-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1" data-block-type="discussion" data-usage-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@discussion+block@a5e9159b4ffc4ac485379010f2715256" data-request-token="38fd80f6033b11efaa280242ac12000b" data-graded="True" data-has-score="False">
<div class="page-banner"><div class="alert alert-warning"><span class="icon icon-alert fa fa fa-warning" aria-hidden="true"></span><div class="message-content">Discussion is only accessible to enrolled learners. Sign in or register, and enroll in this course to view it.</div></div></div>
</div>
</div>
</div>
<script type="text/javascript">
(function (require) {
require(['/static/js/dateutil_factory.be68acdff619.js?raw'], function () {
require(['js/dateutil_factory'], function (DateUtilFactory) {
DateUtilFactory.transform('.localized-datetime');
});
});
}).call(this, require || RequireJS.require);
</script>
<script>
function emit_event(message) {
parent.postMessage(message, '*');
}
</script>
</div>
<div class="xblock xblock-public_view xblock-public_view-vertical" data-course-id="course-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1" data-init="VerticalStudentView" data-runtime-class="LmsRuntime" data-runtime-version="1" data-block-type="vertical" data-usage-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@vertical+block@af406999467c438391ecdd5cb11c9872" data-request-token="38fd80f6033b11efaa280242ac12000b" data-graded="True" data-has-score="False">
<div class="vert-mod">
<div class="vert vert-0" data-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@markdown+block@c400f58bf0ec49ac95ff9e9eee8fa96a">
<div class="xblock xblock-public_view xblock-public_view-markdown" data-course-id="course-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1" data-block-type="markdown" data-usage-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@markdown+block@c400f58bf0ec49ac95ff9e9eee8fa96a" data-request-token="38fd80f6033b11efaa280242ac12000b" data-graded="True" data-has-score="False">
<div class="markdown_xblock"><ul>
<li>Now we can boot QEMU:</li>
</ul>
<div class="codehilite">
<pre><span></span><code>qemu-system-x86_64 -nographic -bios Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd <span class="se">\</span>
-chardev file,path<span class="o">=</span>debug.log,id<span class="o">=</span>edk2-debug <span class="se">\</span>
-device isa-debugcon,iobase<span class="o">=</span>0x402,chardev<span class="o">=</span>edk2-debug <span class="se">\</span>
-net none -device qemu-xhci,id<span class="o">=</span>xhci -m 512M <span class="se">\</span>
/home/user/alpine-virt-3.16.1-x86_64.iso
</code></pre>
</div>
<ul>
<li>Login with root</li>
</ul>
<p>To list all runtime-accessible variables:</p>
<div class="codehilite">
<pre><span></span><code>ls /sys/firmware/efi/efivars/
Boot0000-8be4df61-93ca-11d2-aa0d-00e098032b8c
Boot0001-8be4df61-93ca-11d2-aa0d-00e098032b8c
Boot0002-8be4df61-93ca-11d2-aa0d-00e098032b8c
<span class="o">(</span>...<span class="o">)</span>
PlatformLang-8be4df61-93ca-11d2-aa0d-00e098032b8c
PlatformLangCodes-8be4df61-93ca-11d2-aa0d-00e098032b8c
PlatformRecovery0000-8be4df61-93ca-11d2-aa0d-00e098032b8c
Timeout-8be4df61-93ca-11d2-aa0d-00e098032b8c
VarErrorFlag-04b37fe8-f6ae-480b-bdd5-37d98c5e89aa
</code></pre>
</div>
<p>Note that most of them has the same GUID <code>8BE4DF61-93CA-11D2-AA0D-00E098032B8C</code>,
but there are some different values, too. We can check in
<code>Build/OvmfX64/DEBUG_GCC5/FV/Guid.xref</code> that was produced during building OVMF
that this GUID corresponds to <code>gEfiGlobalVariableGuid</code>.</p>
<p>Check what is the GUID of a variable with name <code>NvVars</code>.</p>
<p>UEFI variables rarely contain just printable characters, and even if they did,
the variable starts with its attributes, which have bytes with value 0. Because
of that, <code>cat</code> can't be used, we must utilize <code>xxd</code> or <code>hexdump</code>, for example:</p>
<div class="codehilite">
<pre><span></span><code>xxd /sys/firmware/efi/efivars/Boot0003-8be4df61-93ca-11d2-aa0d-00e098032b8c -g <span class="m">1</span>
<span class="m">00000000</span>: <span class="m">07</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">01</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> 2c <span class="m">00</span> <span class="m">45</span> <span class="m">00</span> <span class="m">46</span> <span class="m">00</span> <span class="m">49</span> <span class="m">00</span> ........,.E.F.I.
<span class="m">00000010</span>: <span class="m">20</span> <span class="m">00</span> <span class="m">49</span> <span class="m">00</span> 6e <span class="m">00</span> <span class="m">74</span> <span class="m">00</span> <span class="m">65</span> <span class="m">00</span> <span class="m">72</span> <span class="m">00</span> 6e <span class="m">00</span> <span class="m">61</span> <span class="m">00</span> .I.n.t.e.r.n.a.
<span class="m">00000020</span>: 6c <span class="m">00</span> <span class="m">20</span> <span class="m">00</span> <span class="m">53</span> <span class="m">00</span> <span class="m">68</span> <span class="m">00</span> <span class="m">65</span> <span class="m">00</span> 6c <span class="m">00</span> 6c <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> l. .S.h.e.l.l...
<span class="m">00000030</span>: <span class="m">04</span> <span class="m">07</span> <span class="m">14</span> <span class="m">00</span> c9 bd b8 7c eb f8 <span class="m">34</span> 4f aa ea 3e e4 .......<span class="p">|</span>..4O..>.
<span class="m">00000040</span>: af <span class="m">65</span> <span class="m">16</span> a1 <span class="m">04</span> <span class="m">06</span> <span class="m">14</span> <span class="m">00</span> <span class="m">83</span> a5 <span class="m">04</span> 7c 3e 9e 1c 4f .e.........<span class="p">|</span>>..O
<span class="m">00000050</span>: ad <span class="m">65</span> e0 <span class="m">52</span> <span class="m">68</span> d0 b4 d1 7f ff <span class="m">04</span> <span class="m">00</span> .e.Rh.......
</code></pre>
</div>
</div>
</div>
</div>
<div class="vert vert-1" data-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@done+block@f9e12b7bf6e54cf28091ee5a8201548e">
<div class="xblock xblock-public_view xblock-public_view-done" data-course-id="course-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1" data-block-type="done" data-usage-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@done+block@f9e12b7bf6e54cf28091ee5a8201548e" data-request-token="38fd80f6033b11efaa280242ac12000b" data-graded="True" data-has-score="True">
<div class="page-banner"><div class="alert alert-warning"><span class="icon icon-alert fa fa fa-warning" aria-hidden="true"></span><div class="message-content">Completion is only accessible to enrolled learners. Sign in or register, and enroll in this course to view it.</div></div></div>
</div>
</div>
<div class="vert vert-2" data-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@discussion+block@9bf89c26242f49beabde7c24ffd695bc">
<div class="xblock xblock-public_view xblock-public_view-discussion" data-course-id="course-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1" data-block-type="discussion" data-usage-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@discussion+block@9bf89c26242f49beabde7c24ffd695bc" data-request-token="38fd80f6033b11efaa280242ac12000b" data-graded="True" data-has-score="False">
<div class="page-banner"><div class="alert alert-warning"><span class="icon icon-alert fa fa fa-warning" aria-hidden="true"></span><div class="message-content">Discussion is only accessible to enrolled learners. Sign in or register, and enroll in this course to view it.</div></div></div>
</div>
</div>
</div>
<script type="text/javascript">
(function (require) {
require(['/static/js/dateutil_factory.be68acdff619.js?raw'], function () {
require(['js/dateutil_factory'], function (DateUtilFactory) {
DateUtilFactory.transform('.localized-datetime');
});
});
}).call(this, require || RequireJS.require);
</script>
<script>
function emit_event(message) {
parent.postMessage(message, '*');
}
</script>
</div>
<div class="xblock xblock-public_view xblock-public_view-vertical" data-course-id="course-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1" data-init="VerticalStudentView" data-runtime-class="LmsRuntime" data-runtime-version="1" data-block-type="vertical" data-usage-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@vertical+block@bc5a1b7ac6444fa19ef3f4fb201fe8ce" data-request-token="38fd80f6033b11efaa280242ac12000b" data-graded="True" data-has-score="False">
<div class="vert-mod">
<div class="vert vert-0" data-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@markdown+block@2b247dffebbf42b3bfdc83261e49a5e6">
<div class="xblock xblock-public_view xblock-public_view-markdown" data-course-id="course-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1" data-block-type="markdown" data-usage-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@markdown+block@2b247dffebbf42b3bfdc83261e49a5e6" data-request-token="38fd80f6033b11efaa280242ac12000b" data-graded="True" data-has-score="False">
<div class="markdown_xblock"><p>Creating variables is much more complicated that reading them. It can be done
with a one-liner, but to make it easier to understand, we will split this into
separate steps.</p>
<p>1. Create attributes (non-volatile, runtime and bootservice access):</p>
<div class="codehilite">
<pre><span></span><code><span class="nb">echo</span> -en <span class="s2">"\x07\x00\x00\x00"</span> > var.attr
</code></pre>
</div>
<p>2. Create value (or you may use existing file instead):</p>
<div class="codehilite">
<pre><span></span><code><span class="nb">echo</span> <span class="s2">"hello world"</span> > var.val
</code></pre>
</div>
<p>3. Obtain new random GUID:</p>
<div class="codehilite">
<pre><span></span><code><span class="nv">guid</span><span class="o">=</span><span class="s2">"</span><span class="k">$(</span>cat /proc/sys/kernel/random/uuid<span class="k">)</span><span class="s2">"</span>
</code></pre>
</div>
<blockquote>
<p>Depending on use case, you may want to have a predefined GUID that is always
used for given variable. Note that some of them are reserved and may be blocked
by UEFI. An example of such reserved GUID is <code>gEfiGlobalVariableGuid</code>.</p>
</blockquote>
<p>4. Put them together, attributes first:</p>
<div class="codehilite">
<pre><span></span><code>cat var.attr var.val > var
</code></pre>
</div>
<blockquote>
<p>If we were to use Authenticated Variables, we would have to insert serialized,
signed <code>EFI_VARIABLE_AUTHENTICATION_2</code> descriptor between attributes and value.
Creating such descriptor is complicated, and out of scope for this exercise.</p>
</blockquote>
<p>5. Do the write in one operation (<code>bs</code> parameter equals size of file):</p>
<div class="codehilite">
<pre><span></span><code>dd <span class="k">if</span><span class="o">=</span>var <span class="nv">of</span><span class="o">=</span><span class="s2">"/sys/firmware/efi/efivars/Test-</span><span class="nv">$guid</span><span class="s2">"</span> <span class="nv">bs</span><span class="o">=</span><span class="k">$(</span>stat -c %s var<span class="k">)</span>
</code></pre>
</div>
<blockquote>
<p>In some cases you can <code>cp var /sys/firmware/efi/efivars/Test-$guid</code> and it may
work, depending on size of file. It may be good enough in this case, but to be
safe, always use <code>dd</code> with explicitly specified block size.</p>
</blockquote>
<p>6. Confirm that data was written successfully:</p>
<div class="codehilite">
<pre><span></span><code>xxd /sys/firmware/efi/efivars/Test-<span class="nv">$guid</span>
</code></pre>
</div>
<p>Expected output is:</p>
<div class="codehilite">
<pre><span></span><code><span class="m">00000000</span>: <span class="m">0700</span> <span class="m">0000</span> <span class="m">6865</span> 6c6c 6f20 776f 726c 640a ....hello world.
</code></pre>
</div>
</div>
</div>
</div>
<div class="vert vert-1" data-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@done+block@98db31fdb6324fe8b71a5c309c38ac9a">
<div class="xblock xblock-public_view xblock-public_view-done" data-course-id="course-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1" data-block-type="done" data-usage-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@done+block@98db31fdb6324fe8b71a5c309c38ac9a" data-request-token="38fd80f6033b11efaa280242ac12000b" data-graded="True" data-has-score="True">
<div class="page-banner"><div class="alert alert-warning"><span class="icon icon-alert fa fa fa-warning" aria-hidden="true"></span><div class="message-content">Completion is only accessible to enrolled learners. Sign in or register, and enroll in this course to view it.</div></div></div>
</div>
</div>
<div class="vert vert-2" data-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@discussion+block@78b8e500761842aea1723f99070dd202">
<div class="xblock xblock-public_view xblock-public_view-discussion" data-course-id="course-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1" data-block-type="discussion" data-usage-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@discussion+block@78b8e500761842aea1723f99070dd202" data-request-token="38fd80f6033b11efaa280242ac12000b" data-graded="True" data-has-score="False">
<div class="page-banner"><div class="alert alert-warning"><span class="icon icon-alert fa fa fa-warning" aria-hidden="true"></span><div class="message-content">Discussion is only accessible to enrolled learners. Sign in or register, and enroll in this course to view it.</div></div></div>
</div>
</div>
</div>
<script type="text/javascript">
(function (require) {
require(['/static/js/dateutil_factory.be68acdff619.js?raw'], function () {
require(['js/dateutil_factory'], function (DateUtilFactory) {
DateUtilFactory.transform('.localized-datetime');
});
});
}).call(this, require || RequireJS.require);
</script>
<script>
function emit_event(message) {
parent.postMessage(message, '*');
}
</script>
</div>
<div class="xblock xblock-public_view xblock-public_view-vertical" data-course-id="course-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1" data-init="VerticalStudentView" data-runtime-class="LmsRuntime" data-runtime-version="1" data-block-type="vertical" data-usage-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@vertical+block@42ec6005b10e4a9ab698a92eb5635ff2" data-request-token="38fd80f6033b11efaa280242ac12000b" data-graded="True" data-has-score="False">
<div class="vert-mod">
<div class="vert vert-0" data-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@markdown+block@e8c08dd774b04d6180d695275d508da4">
<div class="xblock xblock-public_view xblock-public_view-markdown" data-course-id="course-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1" data-block-type="markdown" data-usage-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@markdown+block@e8c08dd774b04d6180d695275d508da4" data-request-token="38fd80f6033b11efaa280242ac12000b" data-graded="True" data-has-score="False">
<div class="markdown_xblock"><p>Trying to just remove the file we created results in error:</p>
<div class="codehilite">
<pre><span></span><code>rm /sys/firmware/efi/efivars/Test-<span class="nv">$guid</span>
rm: remove <span class="s1">'/sys/firmware/efi/efivars/Test-1282c5c5-fa6d-4631-8139-697048c329f8'</span>? y
rm: can<span class="s1">'t remove '</span>/sys/firmware/efi/efivars/Test-1282c5c5-fa6d-4631-8139-697048c329f8<span class="err">'</span>: Operation not permitted
</code></pre>
</div>
<p>To be able to do so, we have to manually remove the <code>immutable</code> attribute from
this file:</p>
<div class="codehilite">
<pre><span></span><code>chattr -i /sys/firmware/efi/efivars/Test-<span class="nv">$guid</span>
rm /sys/firmware/efi/efivars/Test-<span class="nv">$guid</span>
ls /sys/firmware/efi/efivars/Test-<span class="nv">$guid</span>
ls: /sys/firmware/efi/efivars/Test-1282c5c5-fa6d-4631-8139-697048c329f8: No such file or directory
</code></pre>
</div>
<p><code>chattr -i</code> also has to be used before changing the content of a variable, that
is before doing <code>dd</code> with updated value.</p>
<p>As mentioned earlier, efivarfs files are immutable by default "due to the
presence of numerous firmware bugs"</p>
</div>
</div>
</div>
<div class="vert vert-1" data-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@done+block@ec3a5b1a7b284ba3aea9826ce5cd6989">
<div class="xblock xblock-public_view xblock-public_view-done" data-course-id="course-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1" data-block-type="done" data-usage-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@done+block@ec3a5b1a7b284ba3aea9826ce5cd6989" data-request-token="38fd80f6033b11efaa280242ac12000b" data-graded="True" data-has-score="True">
<div class="page-banner"><div class="alert alert-warning"><span class="icon icon-alert fa fa fa-warning" aria-hidden="true"></span><div class="message-content">Completion is only accessible to enrolled learners. Sign in or register, and enroll in this course to view it.</div></div></div>
</div>
</div>
<div class="vert vert-2" data-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@discussion+block@c60dade7500740eaa739967fa77d5400">
<div class="xblock xblock-public_view xblock-public_view-discussion" data-course-id="course-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1" data-block-type="discussion" data-usage-id="block-v1:OpenSecurityTraining2+Arch4021_intro_UEFI+2023_v1+type@discussion+block@c60dade7500740eaa739967fa77d5400" data-request-token="38fd80f6033b11efaa280242ac12000b" data-graded="True" data-has-score="False">
<div class="page-banner"><div class="alert alert-warning"><span class="icon icon-alert fa fa fa-warning" aria-hidden="true"></span><div class="message-content">Discussion is only accessible to enrolled learners. Sign in or register, and enroll in this course to view it.</div></div></div>
</div>
</div>
</div>
<script type="text/javascript">
(function (require) {
require(['/static/js/dateutil_factory.be68acdff619.js?raw'], function () {
require(['js/dateutil_factory'], function (DateUtilFactory) {
DateUtilFactory.transform('.localized-datetime');
});
});
}).call(this, require || RequireJS.require);
</script>
<script>
function emit_event(message) {
parent.postMessage(message, '*');
}
</script>
</div>