[RFC 00/12] Introduce struct layout randomization feature

Connor Kuehl via cfe-commits cfe-commits at lists.llvm.org
Tue Mar 12 08:14:09 PDT 2019


Thank you for the heads up! I put the patchset on Phabricator and sent 
the RFC out to the cfe-dev mailing list.

On 3/9/19 1:59 AM, Roman Lebedev wrote:
> You probably want to submit this patchset to phabricator.
> It will get lost in mailing list.
>
> On Sat, Mar 9, 2019 at 1:38 AM Connor Kuehl via cfe-commits
> <cfe-commits at lists.llvm.org> wrote:
>> This patch set introduces structure field layout randomization into the Clang
>> compiler. The Randstruct feature is a compile-time hardening technique that
>> randomizes the field layout for designated structures of a code base.
>> Admittedly, this is mostly useful for closed-source releases of code (since
>> the randomization seed would be available for public and open source application
>> s). However, this patch set also enhances Clang’s feature parity with that
>> of GCC which already has the Randstruct feature.
>>
>> This patch set is a from-scratch reimplementation of the Randstruct feature
>> that was originally ported to GCC. The patches for this implementation in GCC
>> can be found here:
>>
>>      https://www.openwall.com/lists/kernel-hardening/2017/04/06/14.
>>
>> This feature identifies structures for randomization in two ways. The first
>> method targets structures that are manually marked with the new
>> “randomize_layout” attribute. The second is an optional feature that will
>> automatically select and randomize structures that are found to consist entirely
>> of function pointers. This automatic selection feature can be extended to
>> include other vulnerable structure types that are safe to randomize as they are
>> identified. You can also opt a specific structure out of this feature with the
>> “no_randomize_layout” attribute. Automatic structure selection is enabled with
>> the “-randstruct-auto” compiler flag. By default, Randstruct seeds on the empty
>> string, but a seed can be supplied with the “-randstruct-seed=” command line
>> argument.
>>
>> This entire patch set is the sum total of an undergraduate computer science
>> capstone team’s effort.
>>
>> Portland State University Clang Randstruct Capstone Team (Fall 2018-Winter 2019):
>>
>> Co-authored-by: Cole Nixon <nixontcole at gmail.com>
>> Co-authored-by: Connor Kuehl <cipkuehl at gmail.com>
>> Co-authored-by: James Foster <jafosterja at gmail.com>
>> Co-authored-by: Jeff Takahashi <jeffrey.takahashi at gmail.com>
>> Co-authored-by: Jordan Cantrell <jordan.cantrell at mail.com>
>> Co-authored-by: Nikk Forbus <nicholas.forbus at gmail.com>
>> Co-authored-by: Tim Pugh <nwtpugh at gmail.com>
>>
>> Connor Kuehl (12):
>>    Add documentation for randstruct attributes
>>    Add randomize_layout attribute and handler
>>    Add no_randomize_layout attribute and handler
>>    Add randomize_layout warning for unions
>>    Add warning for mutually exclusive attributes
>>    Add globals to store command line arguments in
>>    Add randstruct-seed compiler argument
>>    Add automatic structure selection compiler switch
>>    Implement record field randomization algorithms
>>    Fix: Set tail pointer to null in field list
>>    Forward declare RecordFieldReorganizer
>>    Wire up Randstruct; intercept and randomize
>>
>>   clang/include/clang/AST/Decl.h                |   1 +
>>   clang/include/clang/AST/DeclBase.h            |   2 +
>>   clang/include/clang/AST/RandstructSeed.h      |   8 +
>>   .../clang/AST/RecordFieldReorganizer.h        |  59 ++++
>>   clang/include/clang/Basic/Attr.td             |  14 +
>>   clang/include/clang/Basic/AttrDocs.td         |  45 +++
>>   .../include/clang/Basic/DiagnosticASTKinds.td |   5 +
>>   clang/include/clang/Driver/CC1Options.td      |   2 +
>>   clang/include/clang/Driver/Options.td         |   4 +
>>   clang/lib/AST/CMakeLists.txt                  |   1 +
>>   clang/lib/AST/DeclBase.cpp                    |   3 +
>>   clang/lib/AST/RecordFieldReorganizer.cpp      | 257 ++++++++++++++++++
>>   clang/lib/AST/RecordLayoutBuilder.cpp         |  20 ++
>>   clang/lib/Driver/ToolChains/Clang.cpp         |  10 +
>>   clang/lib/Frontend/CompilerInvocation.cpp     |   8 +
>>   clang/lib/Sema/SemaDeclAttr.cpp               |   6 +
>>   ...a-attribute-supported-attributes-list.test |   2 +
>>   17 files changed, 447 insertions(+)
>>   create mode 100644 clang/include/clang/AST/RandstructSeed.h
>>   create mode 100644 clang/include/clang/AST/RecordFieldReorganizer.h
>>   create mode 100644 clang/lib/AST/RecordFieldReorganizer.cpp
>>
>> --
>> 2.17.1
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list