<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta>
      <journal-title-group>
        <journal-title>Italian Conference on Cybersecurity, June</journal-title>
      </journal-title-group>
    </journal-meta>
    <article-meta>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Mahboobe Sadeghipour Roodsari</string-name>
          <email>mahboobe.sadeghpourrudsari@polito.it</email>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Ebrahim Nouri</string-name>
          <email>nouri.ebrahim@ut.ac.ir</email>
          <xref ref-type="aff" rid="aff3">3</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Fatemeh Sheikhshoaei</string-name>
          <xref ref-type="aff" rid="aff3">3</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Paolo Prinetto</string-name>
          <email>paolo.prinetto@polito.it</email>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Zainalabedin Navabi</string-name>
          <email>navabi@ut.ac.ir</email>
          <xref ref-type="aff" rid="aff3">3</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Cybersecurity National Laboratory</institution>
          ,
          <addr-line>Consorzio Interuniversitario Nazionale per l'Informatica</addr-line>
          ,
          <country country="IT">Italy</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Dipartimento di Automatica e Informatica, Politecnico di Torino</institution>
          ,
          <addr-line>Turin</addr-line>
          ,
          <country country="IT">Italy</country>
        </aff>
        <aff id="aff2">
          <label>2</label>
          <institution>IMT Scuola Alti Studi Lucca</institution>
          ,
          <addr-line>Lucca</addr-line>
          ,
          <country country="IT">Italy</country>
        </aff>
        <aff id="aff3">
          <label>3</label>
          <institution>University of Tehran</institution>
          ,
          <addr-line>Tehran</addr-line>
          ,
          <country country="IR">Iran</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2022</year>
      </pub-date>
      <volume>2</volume>
      <fpage>0</fpage>
      <lpage>23</lpage>
      <abstract>
        <p>With the growing demand for embedded systems, from home appliances to industrial usage, security is a significant challenge. Return-oriented programming (ROP) and Code reuse attacks are among the most dangerous attacks. They aim to hijack the control flow program to bypass system restrictions and/or execute malicious code. Stack canary is a well-known defense mechanism against these types of attacks. Generally, they employ a secret value to sit in the memory right before a specific location of the memory that is about to be protected. The security of such a system relies on keeping the canary value secret. However, for a single, unaltered key, it is dificult to guarantee secrecy.</p>
      </abstract>
      <kwd-group>
        <kwd>Control flow attack</kwd>
        <kwd>Return Oriented Programming (ROP)</kwd>
        <kwd>Hardware security</kwd>
        <kwd>Stack canary</kwd>
        <kwd>Physical</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>
        As embedded systems for IoT devices become prevalent, more serious precautions have to
be taken to guarantee such systems’ reliability and privacy. Meanwhile, the heterogeneous
nature of these systems opens a wide variety of vulnerabilities in the software, especially when
using low-level programming languages with numerous controls over hardware resources. The
security concern of such systems has been growing in diferent areas, and security extensions
have been adopted, such as secure boot, secure run-time operations, and memory protections.
Software-based attacks have been the subject of research for a long time [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ], [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ].
      </p>
      <p>
        This paper focuses on one of the most vulnerable and possible types of software attacks on
memory, called bufer overflow on the system stack. In processor architectures, the system stack
is a portion of the main memory used to load and store functions’ local variables, pointers,
and return addresses at run-time. By exploiting the software vulnerabilities (e.g., standard
library functions), the attacker can access a portion of the legitimately private memory, or
hijack the program’s control flow for malicious reasons, by directly injecting malicious data
and/or manipulating the code pointers. This is what happens in major exploits, such as in
Return-Oriented Programming (ROP), where the function return address is corrupted. Based
on [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ], more than 80% of vulnerabilities can be exploited by control flow attacks. Therefore, a
lightweight and secure mechanism is needed to overcome this attack. Numerous techniques
have been proposed to make the system resilient to this threat by utilizing software or hardware
solutions. Most of the software-based solutions come with diferent security bugs and a great
cost of performance [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ], [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. So, to reduce the performance overhead of software techniques,
some hardware approaches have been proposed.
      </p>
      <p>
        Data Execution Prevention (DEP) is a traditional defense mechanism that splits the
memory into two parts: each memory page is either executable or writable, BUT not both ( ⊕  ).
Although many techniques consider the code segment of the memory untouched based on this
protection, recent research proves it to still be vulnerable [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ].
      </p>
      <p>
        Address Space Layout Randomization (ASLR) techniques try to muddle regular memory
organization, hoping to make it dificult for an adversary to detect addresses [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ], [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ], [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ], [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ],
[
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]. Other than the massive performance overhead due to the randomizing of the address
space and moving data among the diferent memory segments at run-time, these methods have
been highly vulnerable to side-channel attacks and the growing field of machine learning [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ].
      </p>
      <p>
        Control Flow Integrity (CFI) techniques aim to verify whether the path taken at run-time
follows a set of predetermined paths on the so called Control-Flow Graph (CFG). In general,
these methods use a labeling system corresponding to the program’s control flow instructions,
by matching all possible source and destination pairs. Most CFIs use a shadow stack to store
the previous return addresses in an embedded separate secure cache [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ], [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ], or a dedicated
memory cache in the processor [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ], [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ], [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ], [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ]. Although this is a secure approach for
ROP attacks, the overhead of the needed memory is considerably high. Also, due to the limited
capacity of the shadow stack memory, the shadow stack may overflow for programs with highly
nested loops or recursions, which makes it vulnerable.
      </p>
      <p>
        Stack canaries mark the memory with a private keyword placed on the system stack to
ensure that specific regions have not been tampered by attackers. Any out-of-bounds memory
write changes these values, informing the protection unit about unauthorized activities. A
significant advantage of this technique is its negligible overhead in terms of hardware, power,
and execution time compared to the other solutions. In the traditional approaches, the private
keyword was a fixed value during execution [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ], allowing an attacker to reach the private
keyword and attack the system. Many dynamic key generation approaches were proposed to
overcome the problem [
        <xref ref-type="bibr" rid="ref20">20</xref>
        ], [
        <xref ref-type="bibr" rid="ref21">21</xref>
        ]. However, most of them lead to an increase in the hardware or
execution time overhead.
      </p>
      <p>The present paper proposes a technique for enhancing the stack canary security exploiting
Physical Unclonable Functions (PUF) to improve the security of the canary and keep the main
points of it, such as being lightweight and fast. The main contributions of this work can be
summarized as follows:
• Using the proposed methodology, the code can be changed dynamically during the
runtime. This eliminates the need for pre-analyzing the code;
• The defence mechanism is provided by adding a minimal hardware to the processor. A
secure PUF is used for generating the random canary in each function call, in spite of
using a table of pre-calculated random numbers;
• The proposed approach is not customized for a specific processor or compiler and can be
easily adapted to any processor.</p>
      <p>The rest of the paper is organized as follows. Section 2 introduces some backgrounds such as
bufer overflow attack, canary, and the PUF. Section 3 provides an overview of the previously
proposed techniques using stack canary. The system and attack environment hypotheses and
the challenges in canary design are reviewed in Section 4. Section 5 describes the proposed
security technique. A preliminary evaluation is shown in Section 6, and finally, conclusions are
drawn in Section 7.</p>
    </sec>
    <sec id="sec-2">
      <title>2. Background</title>
      <p>Control-flow attacks are considered among the most dangerous threats of today’s processors.
In such an attack, in the absence of enough monitoring, an attacker tries to get the control of
the program or read critical data by jumping to any part of the memory. Bufer overflow is
one of the most common control-flow attacks on ROP. One of the countermeasures to confront
bufer overflow attack is, for instance, stack canary.</p>
      <p>The present section ofers the necessary background knowledge of the bufer overflow attack,
stack canary, and PUF utilized in the proposed canary.</p>
      <sec id="sec-2-1">
        <title>2.1. Bufer Overflow</title>
        <p>Stack-based bufer overflow occur when a code is reliant on user data and there is a deliberate
misuse of data size to write out of a given memory bound. Having no boundary to write on the
system stack, diferent attacks aim to change particular values such as return address to hijack
control of the program. A simple example of such an attack is shown in Figure 1. In this case,
the adversary writes a contiguous value starting at one bufer and aims to change the return
address to jump to anywhere in the memory and take the program under her control.</p>
      </sec>
      <sec id="sec-2-2">
        <title>2.2. Stack canaries</title>
        <p>
          Stack canary is one of the well-known countermeasures for bufer overflow attacks. A canary
is a secret keyword placed on top of the return address in a local function frame, as shown in
Figure 2. The canary is pushed onto the stack upon function entry. Considering the canary
location, any attempt to change the return address by bufer overflow attack would necessarily
afect the canary value as well. Since the canary value will be compared with the stored value
in the processor before jumping to the return address, any corruption on the canary value will
be detected as an attack. Although a stack canary is widely deployed to secure the system
stack from bufer overflow attacks, the security of the return address is highly dependent on
concealing the value of the canary from the attacker. If this value is revealed to the attacker, the
attacker can easily bypass the canary security. In traditional systems, the canary secret value
might have a short bit length, and therefore could be easily brute-forced [
          <xref ref-type="bibr" rid="ref22">22</xref>
          ]. Regarding this
vulnerability, some works try to generate dynamic values for canary, as discussed in Section 3.
        </p>
      </sec>
      <sec id="sec-2-3">
        <title>2.3. Physical Unclonable Functions (PUF)</title>
        <p>
          As the attention to safety and security grows, the need for authentication and identity validation
has become more and more critical. Making use of cryptographic techniques has been a common
method to protect data. The drawback of data encryption techniques such as hash functions is
a considerable time and hardware overhead. The exploitation of Physical Unclonable Functions
(PUF) is a substitution for the traditional process of generating a secret key and storing it.
As opposed to cryptographic algorithms and other hardware obfuscation techniques, PUFs
are naturally immune to many attacks due to their unpredictable and random nature. A PUF
uses the inherent device process variation to produce a digital signature that is unique and
unclonable, yet easy to be reproduced by the device. Usually, a PUF takes an input (challenge)
to generate an output (response), which acts as an identifier for that particular input. Since
manufacturing process variation is practically always diferent from one chip to another, the
values returned by PUFs act like “fingerprints” for each device. To assess trustworthiness of a
PUF, the properties such as evaluation time, uniqueness, reproducibility, unpredictability, etc.,
must be considered [
          <xref ref-type="bibr" rid="ref23">23</xref>
          ].
        </p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>3. Literature Review</title>
      <p>
        Several works have been done to implement canaries in vulnerable systems for detecting bufer
overflow attacks. The original method, presented in [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ] in 1998, is featuring static canaries.
Although this technique is lightweight, it is susceptible to memory leaks, and can be guessed by
an attacker in few iterations. Various methods have been proposed based on dynamic canary
generation to overcome this drawback. These methods add non-negligible hardware or software
overhead to the canary mechanism, thus lowering canary lightness. One can generate a dynamic
random canary periodically, and suddenly update all system canary values in the memory [
        <xref ref-type="bibr" rid="ref24">24</xref>
        ],
but this brings a huge overhead. However, pre-preparing random canaries and storing them in
a table is an accepted existing procedure, which is utilized by some works that will be explained
in the sequel.
      </p>
      <p>
        DynaGuard [
        <xref ref-type="bibr" rid="ref25">25</xref>
        ] and DifGuard [
        <xref ref-type="bibr" rid="ref26">26</xref>
        ] are compiler-level methods for assigning diferent
canaries to diferent function frames and changing them after each return. Huang et al. [
        <xref ref-type="bibr" rid="ref27">27</xref>
        ]
propose a method using symbolic canaries, and before forking a call, the canary is checked
to see whether it is still one of the symbols or not. Nowadays, an attacker can easily hijack
symbols due to the limited number of them.
      </p>
      <p>
        Some other works generate random numbers using code/system information at run-time.
Piromsopa et al. [
        <xref ref-type="bibr" rid="ref20">20</xref>
        ] add some instructions to generate software-based random numbers for
each canary word. To prevent repetition, searching is done through generated random values.
This implies a huge and unacceptable run-time overhead to the system, between 500% and
11600% dependant on the running program. Hawkins et al. [
        <xref ref-type="bibr" rid="ref28">28</xref>
        ] propose DCR, a randomization
at run-time without compiler support, by adding the ofset of thread local storage (TLS) to
the newly calculated random number. Since re-randomizing stack canaries is not completely
applied, an attacker can detect the canary words after a few runs. P-SSP [
        <xref ref-type="bibr" rid="ref21">21</xref>
        ] rerandomizes
the canaries for a new process/thread or for a new function call. It uses a TLS shadow canary,
which stores the outputs from re-randomizing the TLS canary. The extensions of this method,
raise average time spent by the function prologue and epilogue from 6 to 278-986 CPU cycles
which is unacceptable. The technique presented instead in [
        <xref ref-type="bibr" rid="ref29">29</xref>
        ] adds some instructions to each
function to generate the stack canary at run-time, based on the current execution history, using
a sequence of XOR operations. The drawback of this method is run-time expansion by adding
diferent instructions to each function. PCan is presented in [
        <xref ref-type="bibr" rid="ref30">30</xref>
        ], generating canaries based on
ARMv8.3- pointer authentication (PA). This method is particular to a specific platform. In PESC
[
        <xref ref-type="bibr" rid="ref31">31</xref>
        ], the kernel uses the system’s performance monitor counter registers to generate random
numbers.
      </p>
      <p>In most of the mentioned methods, canary values must be stored somewhere in the program
memory — or maybe in a dedicated processor register — to prevent their reuse, so additional
storage is needed. Furthermore, in functions with highly nested calls, if each child function
gets a new canary value, a linked list is required to record the canary values’ history. However,
some works protect the inner loops with the same canary as the first loop, in spite of being less
secure. These issues make these methods memory-intensive, in contrast to the advantage of
canary methods, which are lightweight.</p>
      <p>
        PUFCanary is presented in [
        <xref ref-type="bibr" rid="ref32">32</xref>
        ] as a diferent method, using PUF to generate a key for each
function bufer in the system stack. The challenge of this PUF is the value of the canary address
in the stack. The PUF response will be XORed by the response of a TRNG to ensure that
the canary value is unique across processes. It generates and adds canaries after each bufer
to ensure that the overflow will happen to none of them. However, due to the high number
of bufers in each function, this method potentially consumes a large memory overhead and
run-time check overhead.
      </p>
      <p>In the next Section, a canary method using lightweight hardware is proposed, making the
system secure without adding the large memory/run-time overhead.</p>
    </sec>
    <sec id="sec-4">
      <title>4. Assumptions and Challenges</title>
      <p>Adversary model: In our method, we assume that an attacker is able to inject arbitrary inputs
into the system stack. We also consider the attacker to be limited to software manipulation:
any hardware fault-injection or signal snifing that gives the attacker a full control over reading
and writing into the processor internal registers is out of the scope of this paper. Also, writing
into the memory is not boundless. Therefore, the adversary can only write into the memory
segments specified by the application. The attacker can reset the process as many times as she
wants, and has the option to perform a brute force attack in order to obtain the canary value.</p>
      <p>Architecture model: We assume that our target architecture is a 32-bit machine. Therefore,
32 bits is the dimension of the value used as the canary value.</p>
      <p>Canary challenges: One of the canary-based techniques challenges is to ensure the secrecy
of the canary value itself. Static canaries rely only on a single value, which potentially can
be attained using diferent kinds of attacks. Therefore, the dynamic canary has become an
interesting subject in recent research. Generating dynamic canary faces three main challenges:
• Generate well-distributed random values to be used as the canary;
• Design a practical security module in terms of hardware and power consumption overhead;
• Achieve reasonable execution time for generating and verifying the canary.</p>
    </sec>
    <sec id="sec-5">
      <title>5. Proposed Mechanism</title>
      <p>As discussed in the previous Section, the existing techniques are relatively expensive due to the
run-time and memory overhead, that inevitably increase power consumption, or the methods
are not secure enough as the dynamic secret keys for canaries are easy to guess and/or predict.
This is not acceptable for many embedded applications (including IoT). To overcome this issue,
we propose our PUF-based canary approach, which exploits a lightweight reproducible dynamic
canary to fit resource-limited applications. In the following Section, the work is discussed into
canary generation and canary check. After that, the complete module is discussed.</p>
      <sec id="sec-5-1">
        <title>5.1. Canary Generation</title>
        <p>We use a conventional canary-based memory organization. In order to generate a random
canary for each function, we use a PUF module. PUF is able to generate a random response
for each challenge, which is reproducible whenever needed. The benefit of using PUF is the
uniqueness of the response on each device, making the response value hard to guess for an
outer attacker.</p>
        <p>To generate various challenges, one way is to use a table of random numbers. However, it
consumes extra memory and shows repetitive behavior after a while, making it insecure. In the
proposed method, we use the function return address itself as a seed to generate the canary
word; notice that the return address points to the next word with respect to the function call
instruction (P C + 4). Using return address as a key has two main goals:
1) the value is dynamically selected and unique for each function call during the run-time;
2) it is reproducible, so there is no need to store this value in an extra cache or memory, as
we simply choose the return address.</p>
        <p>As shown in the Figure 3, starting from a function call, the address of the following 32-bit
instruction (P C + 4) is loaded into the C u r r A d d r (Current Address) register; PUF takes it as a
challenge, and 32 bits of the output are selected as a random response. The R e t P U F (Return PUF)
register stores the PUF response when PUF generates the completion signal. The registered
value in the R e t P U F register needs to be stored in a location on top of the return address on the
system stack. This ensures that diferent calls result in diferent canaries even for the same
function. In addition, the dynamic generation of the canary makes its value harder to guess and
decreases the possibility of reproducing it later.</p>
        <p>Our method does not compel designers to use specific types of PUF. Any PUF can be featured
as long as two conditions are met. One is that the generated response should be ready at
maximum in one clock cycle after the challenge is fed (such as rig oscillator, or arbiter PUFs).
Otherwise, it would not be possible to detect and prevent attacks on time. Also, PUF must
generate only one unique response for each given challenge, which means for every input
challenge, we get a single and specific response as the output.</p>
      </sec>
      <sec id="sec-5-2">
        <title>5.2. Checking Canaries</title>
        <p>For completing the method, the canary must be verified. Since the original canary is not stored
in any extra memory, in order to validate it, the architecture should be able to regenerate it by
using the return address in the stack. The checking process can be done in parallel with the other
tasks on the processor; there is no need to stall the processor and wait for the response. The
architecture ensures that the response will be ready before the execution of the next instruction.
The overall view of the checking module is shown in the Figure 4. The process is discussed in
detail in the following.</p>
        <p>When executing the return instruction, first, the canary is loaded, and the 32-bits canary
value is stored in StacCan (Stack Canary) register. Then, P C goes pointing to the after-call
instruction. Its value is again loaded to C u r r A d d r register to re-calculate the canary by using
PUF. The result is then compared using the P U F C o m p module (PUF Comparator), and if values do
not match, the overflow exception occurs.</p>
        <p>Notably, we share as many components as possible between the two phases. As a result, we
only use one PUF module and the same C u r r A d d r register for both generation and checking.
The overall architecture is shown in the Figure 5.</p>
        <p>The proposed method can be applied to various kinds of applications. It dynamically produces
a unique and random canary for each function call, making it extremely dificult for the adversary
to guess the value with trial and error. Even in the case of recursion, in which the canary value
would be the same, as long as the function is calling itself, the security is still guaranteed. Due
to a considerable number of recursive calls in such applications, the canary value appears to be
static, which might cause the protection system to fail by revealing the canary. Still, to have a
successful attack, one should substitute a malicious address along with its corresponding canary,
which is only possible if the adversary gets access to the system PUF generator. In other words,
using this technique, both return address and canary values must be controlled to inject any
attack.</p>
        <p>The solution just presents a limited risk in the case where the attacker is interested in reusing
a return address that has already been used and instrumented with a canary, somewhere else in
the code. In that case, through a side attack (e.g., bufer over-read), it could obtain the entire
return address-canary pair, and inject it to jump to that destination. However, the attacker’s
capabilities are extremely limited, and in no practical case this allow her to obtain an arbitrary
execution, which is instead coveted by those using this type of attack.</p>
      </sec>
    </sec>
    <sec id="sec-6">
      <title>6. Preliminary Evaluation</title>
      <p>
        We evaluate our design by analyzing it against diferent attacks. Several brute-force attacks
are developed that aim to break canary protection. A full brute-force attack tries to guess all
possible combinations for the canary value. Therefore, the exploration space is 232, which might
be considered as afordable by modern computation systems [
        <xref ref-type="bibr" rid="ref22">22</xref>
        ].
      </p>
      <p>However, our proposed method is immune to these attacks, as realizing canary value alone is
not enough to bypass the protection system. We explicitly take two values into account, i.e.,
the canary value and the return address. To successfully perform the attack, one must produce
a corresponding canary for a specific malicious data (targeted return address) that is about
to be injected. However, canary generation is only possible through the PUF module, which
is closed inside the CPU, and not observable or controllable outside the hardware. Also, in
comparison with the other similar canary-based techniques, our proposed method can tolerate
discontinuous memory writing, meaning that even keeping the canary location intact does
not compromise security. Furthermore, this technique can be applied to the processors with
multi-execution units and out-of-order execution.</p>
    </sec>
    <sec id="sec-7">
      <title>7. Conclusion and Future Works</title>
      <p>Stack canary is an efective, low-overhead technique to detect and overcome stack overflow
attacks, but it has its own flaws. Often, a single secret key to protect the return addresses is
relied on. Diferent attacks might reveal this value, making the protection mechanism fail.
Using complicated cryptographic systems to secure the secret key makes the overall design
remarkably complex. In domains like embedded systems, only a certain amount of hardware
overhead is acceptable.</p>
      <p>We suggested a lightweight canary-based technique to generate dynamic canaries at run-time.
A PUF module is used to make sure no outside attacker is able to reproduce the canary value.
Also, no software process has access to generate the canaries. Since the proposed method is not
software-based, canary generation and verification can be done parallel with the processor’s
execution routine, with negligible performance overhead. Furthermore, the technique is not
susceptible to brute-force attacks, since for a successful return, a valid canary must always be
produced.</p>
      <p>
        Future investigation will involve experimental implementation of the present mechanism
into soft cores (e.g., custom RISC-V architectures [
        <xref ref-type="bibr" rid="ref33">33</xref>
        ]. Evaluation can be done first with core
simulator aided by random number generation to emulate the PUF behavior. This first step
could be helpful for assessing security. Then, synthesized version of the instrumented core onto
FPGA could be produced to efectively test real PUF and assess overhead in terms of execution
times and power consumption.
      </p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>Z.</given-names>
            <surname>Wang</surname>
          </string-name>
          , P. Liu,
          <article-title>Position paper: GPT conjecture: understanding the trade-ofs between granularity, performance and timeliness in control-flow integrity</article-title>
          ,
          <source>Cybersecurity</source>
          <volume>4</volume>
          (
          <year>2021</year>
          )
          <fpage>1</fpage>
          -
          <lpage>9</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>M.</given-names>
            <surname>Abadi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Budiu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>U.</given-names>
            <surname>Erlingsson</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Ligatti</surname>
          </string-name>
          ,
          <article-title>Control-flow integrity principles, implementations, and applications</article-title>
          ,
          <source>ACM Transactions on Information and System Security (TISSEC) 13</source>
          (
          <year>2009</year>
          )
          <fpage>1</fpage>
          -
          <lpage>40</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>W.</given-names>
            <surname>He</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Das</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W.</given-names>
            <surname>Zhang</surname>
          </string-name>
          , Y. Liu,
          <article-title>BBB-CFI: lightweight CFI approach against code-reuse attacks using basic block information</article-title>
          ,
          <source>ACM Transactions on Embedded Computing Systems (TECS) 19</source>
          (
          <year>2020</year>
          )
          <fpage>1</fpage>
          -
          <lpage>22</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>L.</given-names>
            <surname>Chen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Jiang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Zhang</surname>
          </string-name>
          ,
          <article-title>Code reuse prevention through control flow lazily check</article-title>
          ,
          <source>in: 2012 IEEE 18th Pacific Rim International Symposium on Dependable Computing, IEEE</source>
          ,
          <year>2012</year>
          , pp.
          <fpage>51</fpage>
          -
          <lpage>60</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>T.</given-names>
            <surname>Bletsch</surname>
          </string-name>
          ,
          <string-name>
            <given-names>X.</given-names>
            <surname>Jiang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Freeh</surname>
          </string-name>
          ,
          <article-title>Mitigating code-reuse attacks with control-flow locking</article-title>
          ,
          <source>in: Proceedings of the 27th Annual Computer Security Applications Conference</source>
          ,
          <year>2011</year>
          , pp.
          <fpage>353</fpage>
          -
          <lpage>362</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>Y.</given-names>
            <surname>Kim</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Daly</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Kim</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Fallin</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J. H.</given-names>
            <surname>Lee</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Lee</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Wilkerson</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Lai</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O.</given-names>
            <surname>Mutlu</surname>
          </string-name>
          ,
          <article-title>Flipping bits in memory without accessing them: An experimental study of DRAM disturbance errors</article-title>
          ,
          <source>ACM SIGARCH Computer Architecture News</source>
          <volume>42</volume>
          (
          <year>2014</year>
          )
          <fpage>361</fpage>
          -
          <lpage>372</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>Y.</given-names>
            <surname>Liang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>X.</given-names>
            <surname>Ma</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Wu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>X.</given-names>
            <surname>Tang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Gao</surname>
          </string-name>
          , G. Peng,
          <string-name>
            <given-names>C.</given-names>
            <surname>Jia</surname>
          </string-name>
          ,
          <string-name>
            <surname>H. Zhang,</surname>
          </string-name>
          <article-title>Stack layout randomization with minimal rewriting of Android binaries</article-title>
          ,
          <source>in: ICISC 2015</source>
          , Springer,
          <year>2015</year>
          , pp.
          <fpage>229</fpage>
          -
          <lpage>245</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <surname>T. PaX</surname>
          </string-name>
          ,
          <article-title>PaX address space layout randomization (ASLR)</article-title>
          , http://pax. grsecurity. net/docs/aslr. txt (
          <year>2003</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>J.</given-names>
            <surname>Ganz</surname>
          </string-name>
          , S. Peisert, ASLR:
          <article-title>How robust is the randomness?</article-title>
          , IEEE,
          <year>2017</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>S.</given-names>
            <surname>Bhatkar</surname>
          </string-name>
          , D. C. DuVarney, R. Sekar,
          <article-title>Address obfuscation: An eficient approach to combat a broad range of memory error exploits</article-title>
          ,
          <source>in: 12th USENIX Security Symposium (USENIX Security 03)</source>
          ,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>S.</given-names>
            <surname>Bhatkar</surname>
          </string-name>
          , D. C. DuVarney, R. Sekar,
          <article-title>Eficient Techniques for Comprehensive Protection from Memory Error Exploits</article-title>
          .,
          <source>in: USENIX Security Symposium</source>
          , volume
          <volume>10</volume>
          ,
          <year>2005</year>
          , pp.
          <fpage>1251398</fpage>
          -
          <lpage>1251415</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>N.</given-names>
            <surname>Carlini</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Wagner</surname>
          </string-name>
          , {
          <article-title>ROP} is still dangerous: Breaking modern defenses</article-title>
          ,
          <source>in: 23rd USENIX Security Symposium (USENIX Security 14)</source>
          ,
          <year>2014</year>
          , pp.
          <fpage>385</fpage>
          -
          <lpage>399</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <surname>A. De</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Basu</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          <string-name>
            <surname>Ghosh</surname>
          </string-name>
          , T. Jaeger, FIXER:
          <article-title>Flow integrity extensions for embedded RISC-V, in: 2019 Design, Automation</article-title>
          &amp; Test in Europe Conference &amp;
          <string-name>
            <surname>Exhibition (DATE),</surname>
            <given-names>IEEE</given-names>
          </string-name>
          ,
          <year>2019</year>
          , pp.
          <fpage>348</fpage>
          -
          <lpage>353</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <surname>J.-L. Danger</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Facon</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          <string-name>
            <surname>Guilley</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          <string-name>
            <surname>Heydemann</surname>
            ,
            <given-names>U.</given-names>
          </string-name>
          <string-name>
            <surname>Kühne</surname>
            ,
            <given-names>A. S.</given-names>
          </string-name>
          <string-name>
            <surname>Merabet</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          <article-title>Timbert, CCFI-cache: A transparent and flexible hardware protection for code and control-flow integrity</article-title>
          ,
          <source>in: 2018 21st Euromicro Conference on Digital System Design (DSD)</source>
          , IEEE,
          <year>2018</year>
          , pp.
          <fpage>529</fpage>
          -
          <lpage>536</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <surname>D. B. Roy</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          <string-name>
            <surname>Alam</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          <string-name>
            <surname>Bhattacharya</surname>
            ,
            <given-names>V.</given-names>
          </string-name>
          <string-name>
            <surname>Govindan</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          <string-name>
            <surname>Regazzoni</surname>
            ,
            <given-names>R. S.</given-names>
          </string-name>
          <string-name>
            <surname>Chakraborty</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          <string-name>
            <surname>Mukhopadhyay</surname>
          </string-name>
          ,
          <article-title>Customized instructions for protection against memory integrity attacks</article-title>
          ,
          <source>IEEE Embedded Systems Letters</source>
          <volume>10</volume>
          (
          <year>2018</year>
          )
          <fpage>91</fpage>
          -
          <lpage>94</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>C.</given-names>
            <surname>Bresch</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Michelet</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Amato</surname>
          </string-name>
          , T. Meyer,
          <string-name>
            <given-names>D.</given-names>
            <surname>Hely</surname>
          </string-name>
          ,
          <article-title>A red team blue team approach towards a secure processor design with hardware shadow stack</article-title>
          ,
          <source>in: 2017 IEEE 2nd International Verification and Security Workshop</source>
          (IVSW), IEEE,
          <year>2017</year>
          , pp.
          <fpage>57</fpage>
          -
          <lpage>62</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>A.</given-names>
            <surname>Chaudhari</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J. A.</given-names>
            <surname>Abraham</surname>
          </string-name>
          ,
          <article-title>Efective control flow integrity checks for intrusion detection</article-title>
          ,
          <source>in: 2018 IEEE 24th International Symposium on On-Line Testing And Robust System Design (IOLTS)</source>
          , IEEE,
          <year>2018</year>
          , pp.
          <fpage>1</fpage>
          -
          <lpage>6</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <given-names>N.</given-names>
            <surname>Christoulakis</surname>
          </string-name>
          ,
          <string-name>
            <given-names>G.</given-names>
            <surname>Christou</surname>
          </string-name>
          ,
          <string-name>
            <given-names>E.</given-names>
            <surname>Athanasopoulos</surname>
          </string-name>
          , S. Ioannidis, HCFI:
          <article-title>Hardware-enforced control-flow integrity</article-title>
          ,
          <source>in: Proceedings of the Sixth ACM Conference on Data and Application Security and Privacy</source>
          ,
          <year>2016</year>
          , pp.
          <fpage>38</fpage>
          -
          <lpage>49</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <given-names>C.</given-names>
            <surname>Cowan</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Pu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Maier</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Walpole</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Bakke</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Beattie</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Grier</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Wagle</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Q.</given-names>
            <surname>Zhang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Hinton</surname>
          </string-name>
          ,
          <article-title>Stackguard: automatic adaptive detection and prevention of bufer-overflow attacks</article-title>
          .,
          <source>in: USENIX security symposium</source>
          , volume
          <volume>98</volume>
          , San Antonio, TX,
          <year>1998</year>
          , pp.
          <fpage>63</fpage>
          -
          <lpage>78</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20]
          <string-name>
            <given-names>K.</given-names>
            <surname>Piromsopa</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Chiamwongpaet</surname>
          </string-name>
          ,
          <article-title>Secure bit enhanced canary: Hardware enhanced buferoverflow protection</article-title>
          ,
          <source>in: 2008 IFIP International Conference on Network and Parallel Computing</source>
          , IEEE,
          <year>2008</year>
          , pp.
          <fpage>125</fpage>
          -
          <lpage>131</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [21]
          <string-name>
            <given-names>Z.</given-names>
            <surname>Wang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>X.</given-names>
            <surname>Ding</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Pang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Guo</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Zhu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Mao</surname>
          </string-name>
          ,
          <article-title>To detect stack bufer overflow with polymorphic canaries</article-title>
          ,
          <source>in: 2018 48th Annual IEEE/IFIP International Conference on Dependable Systems and Networks (DSN)</source>
          , IEEE,
          <year>2018</year>
          , pp.
          <fpage>243</fpage>
          -
          <lpage>254</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [22]
          <string-name>
            <surname>K. T. Dave</surname>
          </string-name>
          ,
          <article-title>Brute-force Attack 'Seeking but Distressing'</article-title>
          ,
          <source>Int. J. Innov. Eng. Technol. Brute-force 2</source>
          (
          <year>2013</year>
          )
          <fpage>75</fpage>
          -
          <lpage>78</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [23]
          <string-name>
            <given-names>R.</given-names>
            <surname>Maes</surname>
          </string-name>
          ,
          <string-name>
            <surname>I. Verbauwhede</surname>
          </string-name>
          ,
          <article-title>Physically unclonable functions: A study on the state of the art and future research directions</article-title>
          , Towards Hardware-Intrinsic
          <string-name>
            <surname>Security</surname>
          </string-name>
          (
          <year>2010</year>
          )
          <fpage>3</fpage>
          -
          <lpage>37</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          [24]
          <string-name>
            <given-names>H.</given-names>
            <surname>Marco-Gisbert</surname>
          </string-name>
          ,
          <string-name>
            <surname>I. Ripoll</surname>
          </string-name>
          ,
          <article-title>Preventing brute force attacks against stack canary protection on networking servers</article-title>
          ,
          <source>in: 2013 IEEE 12th International Symposium on Network Computing and Applications</source>
          , IEEE,
          <year>2013</year>
          , pp.
          <fpage>243</fpage>
          -
          <lpage>250</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          [25]
          <string-name>
            <given-names>T.</given-names>
            <surname>Petsios</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V. P.</given-names>
            <surname>Kemerlis</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Polychronakis</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A. D.</given-names>
            <surname>Keromytis</surname>
          </string-name>
          , Dynaguard:
          <article-title>Armoring canary-based protections against brute-force attacks</article-title>
          ,
          <source>in: Proceedings of the 31st Annual Computer Security Applications Conference</source>
          ,
          <year>2015</year>
          , pp.
          <fpage>351</fpage>
          -
          <lpage>360</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref26">
        <mixed-citation>
          [26]
          <string-name>
            <given-names>J.</given-names>
            <surname>Zhu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W.</given-names>
            <surname>Zhou</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Z.</given-names>
            <surname>Wang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Mu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Mao</surname>
          </string-name>
          , Difguard:
          <article-title>Obscuring sensitive information in canary based protections</article-title>
          ,
          <source>in: International Conference on Security and Privacy in Communication Systems</source>
          , Springer,
          <year>2017</year>
          , pp.
          <fpage>738</fpage>
          -
          <lpage>751</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref27">
        <mixed-citation>
          [27]
          <string-name>
            <given-names>N.</given-names>
            <surname>Huang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Huang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Z.</given-names>
            <surname>Deng</surname>
          </string-name>
          ,
          <article-title>Automatic Detection of Stack Overflow Attack in Canary</article-title>
          , in: 2018 Eighth International Conference on Instrumentation &amp;
          <article-title>Measurement, Computer, Communication and Control (IMCCC)</article-title>
          , IEEE,
          <year>2018</year>
          , pp.
          <fpage>1418</fpage>
          -
          <lpage>1423</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref28">
        <mixed-citation>
          [28]
          <string-name>
            <given-names>W. H.</given-names>
            <surname>Hawkins</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J. D.</given-names>
            <surname>Hiser</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J. W.</given-names>
            <surname>Davidson</surname>
          </string-name>
          ,
          <article-title>Dynamic canary randomization for improved software security</article-title>
          ,
          <source>in: Proceedings of the 11th Annual Cyber and Information Security Research Conference</source>
          ,
          <year>2016</year>
          , pp.
          <fpage>1</fpage>
          -
          <lpage>7</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref29">
        <mixed-citation>
          [29]
          <string-name>
            <given-names>R. K.</given-names>
            <surname>Shrivastava</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K. J.</given-names>
            <surname>Concessao</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Hota</surname>
          </string-name>
          ,
          <article-title>Code Tamper-Proofing using Dynamic Canaries</article-title>
          ,
          <source>in: 2019 25th Asia-Pacific Conference on Communications (APCC)</source>
          , IEEE,
          <year>2019</year>
          , pp.
          <fpage>238</fpage>
          -
          <lpage>243</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref30">
        <mixed-citation>
          [30]
          <string-name>
            <given-names>H.</given-names>
            <surname>Liljestrand</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Z.</given-names>
            <surname>Gauhar</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Nyman</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.-E.</given-names>
            <surname>Ekberg</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Asokan</surname>
          </string-name>
          ,
          <article-title>Protecting the stack with PACed canaries</article-title>
          ,
          <source>in: Proceedings of the 4th Workshop on System Software for Trusted Execution</source>
          ,
          <year>2019</year>
          , pp.
          <fpage>1</fpage>
          -
          <lpage>6</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref31">
        <mixed-citation>
          [31]
          <string-name>
            <given-names>J.</given-names>
            <surname>Sun</surname>
          </string-name>
          ,
          <string-name>
            <given-names>X.</given-names>
            <surname>Zhou</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W.</given-names>
            <surname>Shen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Zhou</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Ren</surname>
          </string-name>
          ,
          <article-title>PESC: A Per System-Call Stack Canary Design for Linux Kernel</article-title>
          ,
          <source>in: Proceedings of the Tenth ACM Conference on Data and Application Security and Privacy</source>
          ,
          <year>2020</year>
          , pp.
          <fpage>365</fpage>
          -
          <lpage>375</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref32">
        <mixed-citation>
          [32]
          <string-name>
            <surname>A. De</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Basu</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          <string-name>
            <surname>Ghosh</surname>
          </string-name>
          , T. Jaeger,
          <article-title>Hardware assisted bufer protection mechanisms for embedded RISC-V, IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems 39 (</article-title>
          <year>2020</year>
          )
          <fpage>4453</fpage>
          -
          <lpage>4465</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref33">
        <mixed-citation>
          [33]
          <string-name>
            <given-names>M.</given-names>
            <surname>Rajabalipanah</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M. S.</given-names>
            <surname>Roodsari</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Z.</given-names>
            <surname>Jahanpeima</surname>
          </string-name>
          , G. Roascio,
          <string-name>
            <given-names>P.</given-names>
            <surname>Prinetto</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Z.</given-names>
            <surname>Navabi</surname>
          </string-name>
          ,
          <article-title>AFTAB: A RISC-V Implementation with Configurable Gateways for Security, in: 2021 IEEE EastWest Design</article-title>
          &amp; Test
          <string-name>
            <surname>Symposium</surname>
          </string-name>
          (EWDTS), IEEE,
          <year>2021</year>
          , pp.
          <fpage>1</fpage>
          -
          <lpage>6</lpage>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>