Cryptology ePrint Archive: Report 2017/787

When Are Opaque Predicates Useful?

Lukas Zobernig and Steven D. Galbraith and Giovanni Russello

Abstract: Opaque predicates are a commonly used technique in program obfuscation, intended to add complexity to control flow and to insert dummy code or watermarks. However, there are many attacks known to detect opaque predicates and remove dummy code. We survey these attacks and argue that many types of programs cannot be securely obfuscated using opaque predicates. In particular we explain that most previous works on control flow obfuscation have introduced predicates that are easily distinguished from naturally occurring predicates in code, and hence easily removed by an attacker.

We state two conditions that are necessary for a program to be suitable for control flow obfuscation. We give an integrated approach to control flow obfuscation that simultaneously obfuscates real predicates and introduces opaque predicates. The opaque predicates are indistinguishable from the obfuscated real predicates in the program. If an attacker applies the usual approaches (both static and dynamic) to identify and remove opaque predicates then they are likely to remove critical functionality and introduce errors. We have implemented our obfuscator in LLVM. We provide an analysis of the performance of the resulting obfuscated code.

Category / Keywords: applications / program obfuscation, indistinguishable/opaque predicates

Original Publication (with major differences): IEEE TrustCom 2019

Date: received 20 Aug 2017, last revised 21 May 2019

Contact author: lukas zobernig at auckland ac nz

Available format(s): PDF | BibTeX Citation

Note: Title changed.

Version: 20190521:214224 (All versions of this report)

Short URL: ia.cr/2017/787


[ Cryptology ePrint archive ]