public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Laszlo Ersek" <lersek@redhat.com>
To: Paulo Henrique Lacerda de Amorim <phlamorim@riseup.net>
Cc: devel@edk2.groups.io
Subject: Re: [edk2-devel] Interpretation of specification
Date: Fri, 15 Nov 2019 22:32:49 +0100	[thread overview]
Message-ID: <1be71ed3-54dd-f0f9-1f65-ee88ec25a8e1@redhat.com> (raw)
In-Reply-To: <7e4784d1-998c-303b-711b-30f6beb33656@riseup.net>

Paulo,

On 11/15/19 19:51, Paulo Henrique Lacerda de Amorim wrote:
> Im implementing a mechanism which will depends on time based
> authenticated variables, but i got stucked when the SetVariable from
> RuntimeServices return me a code of Security Violation. I started to
> develop my code using the EDK2 and OVMF on QEMU to test the correctness
> of my UEFI Applications, and the code worked properly to set the
> authenticated variables on OVMF, but when i tried the same at the Dell
> Inspiron which uses the AMI implementation as base of UEFI, i always got
> a Security Violation return.
> 
> UEFI Spec give a lot of verifications about setting authenticated
> variables, and my code worked on the open source reference
> implementation, so i got stucked because i cant found out which
> validation is making the SetVariable fails on Dell's BIOS implementation.
> 
> Im using an UEFI Application to call the SetVariable twice one for set
> the variable file_name and other to set variable file_hash, i used a
> script to prepare the payload with the Auth Descriptor using well known
> tools: openssl(1.1.1c 28 May 2019) and sbvarsign(0.9.2).
> 
> - genkeys.sh https://pastebin.com/jjrZGrAB
> This is the script im using to create the keys
> 
> - create_auth_var_files.sh https://pastebin.com/jPQgG0nB
> This is the script to generate the payloads used in the UEFI Application
> to set the authenticated variables, the toc16 is just a code to convert
> an char to CHAR16, the script receive one parameter, which is a file
> name, so it create two files file_name.signed and file_hash.signed,
> which are the payloads to set variable file_name and file_hash using
> time based authentication.
> 
> - TestPkg.c https://pastebin.com/DnwhfuKk This one is the UEFI
> Application which call the SetVariable using the payloads generated by
> create_auth_var_files.sh, TestPkg is supposed to run with the
> file_*.signed in the same path, so it can open and copy the payload to
> use on SetVariable.
> 
> I tried to follow your suggestion (though i skipped the opensource
> plataform "target" because i dont have access to one). As i said, i'm
> using a Dell Inspiron, so i opened a thread in Dell Community:
> 
> https://www.dell.com/community/Inspiron/SetVariable-from-UEFI-RuntimeServices-is-not-working-as-expected/m-p/7411885.
> 
> 
> I informed the BIOS Version which is 2.9.0 from Dell Inc, but later i
> receive a private message saying the support in this case is limited.
> 
> I got an output of UEFI v2.40 (American Megatrends, 0x0005000B) from
> command ver in the UEFI Shell, i tried to contact the technical support
> of AMI, which gave me the following answer:
> 
> "Unless the motherboard is manufactured by AMI, we are not authorized to
> provide support for it. The motherboard manufacturers license our
> generic BIOS and modify it to fit their motherboard specifications;
> thus, we do not have access to the changes made to the BIOS. For
> support, BIOS, and driver updates for your motherboard, please contact
> your motherboard manufacturer. You can also contact the place of
> purchase and inquire if they can provide assistance for you."
> 
> I need to know where in the verification my code is returning a Security
> Violation so i can fix, i can provide all the other files eg: inf and
> dsc files used to compile the code and the directory tree im using too.

I'm sorry to say: I have no idea. Composing the payloads of
authenticated UEFI variables is one of the most difficult things I've
ever done in UEFI code, and whenever that fails for me, digging into
even the *open source* variable driver code, to find the exact reason,
is a nightmare. Unless you get direct help from Dell, I think your only
option is to dump the firmware from your motherboard, and then extract
some modules, and disassemble them. I've read that tools exist for this
kind of work, but I've never used them.

... Honestly, this is why open source should be the norm. :/

Perhaps you can experiment with other physical UEFI implementations,
especially development boards (I seeem to recall names such as
"Minnowboard" and "ValleyView" board).

I'm sorry that I can't help!
Laszlo



> 
> Regards
> 
> Em 24/10/2019 09:33, Laszlo Ersek escreveu:
>> On 10/23/19 19:12, phlamorim@riseup.net wrote:
>>> The following commit on edk2 added a new a check on format of Authenticated variables: https://github.com/tianocore/edk2/commit/c035e37335ae43229d7e68de74a65f2c01ebc0af ( https://github.com/tianocore/edk2/commit/c035e37335ae43229d7e68de74a65f2c01ebc0af )
>>>
>>> After this point some implementations started to have differences in the validation of the format of Authenticator Descriptor as we can se here: https://blog.hansenpartnership.com/uefi-secure-boot/#comment-48351
>>>
>>> This case make me reach the following discussions: https://bugzilla.tianocore.org/show_bug.cgi?id=586 where i have seen lots of tools(more on linux) dont generate the correct format to use on the payload for TimeBased authenticated variables, at this time i was just trying to create a private authenticated variable, first thig which worked is to use this patch: https://patchew.org/EDK2/1525903747.5882.11.camel@HansenPartnership.com/ ( https://patchew.org/EDK2/1525903747.5882.11.camel@HansenPartnership.com/ )
>>>
>>> But this patch never got merged, so i realized the tools on linux received upgrades to work properly with Authentication Variables of the edk2, but the same code just dont worked at a real machine using a ASROCK board. So my question is, where the developers should trust to consume the UEFI APIs in a trusted way. Another example i had is the path separator "\" or "/", edk2 uses "/" but the spec allow both, ASROCK mix both sometimes it can lead to some errors. I want to know if i can trust if my code work on EDK2 it should work on all other implementations too, and how we will try to remove these ambiguities of interpretation.
>> I suggest writing code against the published UEFI spec, and testing at
>> least with edk2. If edk2 does not behave in accordance with the UEFI
>> spec, then it could be a bug in edk2, or in the spec. Report the issue
>> on edk2-devel, and the community will try to figure out which half is wrong.
>>
>> If your code seems correct, according to both the UEFI spec and to an
>> open source edk2 platform, but it breaks on a particular vendor
>> platform, I suggest talking to that vendor.
>>
>> So, I would suggest the following order of "targets":
>> - spec
>> - reference implementation (edk2)
>> - open source platforms (edk2-platforms)
>> - vendor platform
>>
>> Thanks
>> Laszlo
>>
>>
>> 
>>
> 


  reply	other threads:[~2019-11-15 21:32 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-23 17:12 Interpretation of specification phlamorim
2019-10-24 12:33 ` [edk2-devel] " Laszlo Ersek
2019-11-15 18:51   ` phlamorim
2019-11-15 21:32     ` Laszlo Ersek [this message]
2019-11-23  4:59     ` Eugene Khoruzhenko
2019-11-23 13:08       ` Paulo Henrique Lacerda de Amorim
2019-11-26  6:08         ` Eugene Khoruzhenko
2019-11-26 15:22           ` Paulo Henrique Lacerda de Amorim
2020-01-03 19:52             ` Eugene Khoruzhenko
2020-01-04 17:17               ` Paulo Henrique Lacerda de Amorim
2020-01-07 18:13                 ` Eugene Khoruzhenko
2020-01-08 11:24                   ` Laszlo Ersek
2020-01-08 19:13                     ` James Bottomley
2020-01-09 17:17                       ` Laszlo Ersek
2020-01-09 17:20                         ` James Bottomley
2020-01-10 10:55                           ` Laszlo Ersek
2020-01-10 16:04                             ` James Bottomley

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1be71ed3-54dd-f0f9-1f65-ee88ec25a8e1@redhat.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox