dotnet / runtime

.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.
https://docs.microsoft.com/dotnet/core/
MIT License
15.15k stars 4.71k forks source link

Issues with malformed cyclical TypeSpec #4945

Open nguerrera opened 8 years ago

nguerrera commented 8 years ago

In the process of developing signature parsing facilities for System.Reflection.Metadata, I came across some discrepancies in the CLI specification vs. various signature parsing implementations.

My notes on that are here: https://github.com/dotnet/corefx/pull/5435

One such discrepancy is that the specification states that the encoded token following CMOD_OPT/CMOD_REQ is a TypeDef or TypeRef, but it can be TypeSpec in practice.

This opens up a loophole to cycles as TypeSpecs can contain modifiers, and modifiers can contain TypeSpecs. I put together some quick code to create such bad TypeSpecs here in https://github.com/nguerrera/signature-repros and experimented with ilasm, peverify, and running the resulting programs.

Repro steps

  1. git clone https://github.com/nguerrera/signature-repros
  2. cd signature-repros
  3. build.bat
  4. ildasm SignatureCycle1.exe
  5. peverify SignatureCycle1.exe
  6. SignatureCycle1.exe
  7. repeat steps 4-6 for SignatureCycle2.exe and SignatureCycle3.exe

    Expected results

For all 3 programs:

If the particular program causes the runtime to have to inspect the bad modifiers contents rather than just skip the bad typespec token:

mangod9 commented 4 years ago

Moving to 6 to triage.