Skip to content

Repository files navigation

Library-level Fault Injection Toolkit

LFI automatically identifies the errors exposed by shared libraries, finds potentially buggy error recovery code in program binaries, and produces corresponding injection scenarios. LFI injects the desired faults – in the form of error return codes and corresponding side effects – at the boundary between shared libraries and applications.

Installation

git clone https://github.com/dslab-epfl/lfi.git
cd lfi && make

###Dependencies

  • gcc/clang
  • libxml-dev (or libxml-devel)

###Operating system LFI was tested on 64-bit MacOS and Linux systems. It should also work on their 32-bit counterparts.

Usage

./libfi <configuration file> [-t <subject executable>]

LFI comes with several example fault injection plans; we can use this one for a quick test:

###Basic scenario #1 ./libfi scenarios/sampleplan.xml -t /bin/ls

If everything is OK you should see ls running and failing with a "Bad file descriptor" error.

###Basic scenario #2 (MacOS)

./libfi -t /Applications/Safari.app/Contents/MacOS/Safari scenarios/macos.simple.xml

###Scenarion #3

Next we will try to inject a fault in the communication between the PostgreSQL client and the database. First, install PostgreSQL if you don't have it already (e.g., apt-get install postgresql on Ubuntu) and start the server. Start the PostgreSQL client by typing "psql" and set up a database with some data:

CREATE TABLE friends ( name VARCHAR(30), age INT );
INSERT INTO friends VALUES ('John', 24), ('Mary', 33), ('Bob', 42);
SELECT * FROM friends;
name | age
------+-----
John | 24
Mary | 33
Bob | 42
(3 rows)
\q

Quit the client and create a fault injection plan as follows (you can name it myplan.xml):

<?xml version="1.0" encoding="UTF-8"?>
<plan>
<trigger id="module_libpq" class="CallStackTrigger">
<args>
<frame>
<module>libpq.so.5.1</module>
</frame>
</args>
</trigger>
<trigger id="cc1" class="CallCountTrigger">
<args>
<callcount>3</callcount>
</args>
</trigger>
<function name="recv" retval="-1" errno="EBADF">
<triggerx ref="module_libpq" />
<triggerx ref="cc1" />
</function>
</plan>

This plan tells LFI to intercept the recv() function (which is a libc API call) and, on the 3rd call made by libpq to the function, inject a fault that returns value -1 and sets errno to EBADF. The scenario uses two triggers:

  • The callstack trigger module_libpq that makes the fault be injected only if the call is made from the libpq module. We use the libpq.so library here because the PostreSQL client uses libpq to communicate with the database.
  • The call count trigger cc1 that allows the injection to occur only at the 3rd call to the recv() function.

Now run LFI as follows

./libfi myplan.xml -t /usr/bin/psql

You should witness something like this


% psql
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
postgres=# select * from friends;
name | age ------+-----
John | 24
Mary | 33
Bob | 42
(3 rows)
postgres=# select * from friends;
could not receive data from server: Bad file descriptor
postgres=# select * from friends;
name | age ------+-----
John | 24
Mary | 33
Bob | 42

What is seen here is a fault that interferes with the PostgreSQL's client ability to receive the data from the server.

If you're wondering why the fault occurs on the 2nd call, it's because psql makes one call to recv() during startup; if you add that in, you will see that it is the 3rd time we use recv() that the fault is observed.

For further information about LFI, the available triggers and how to write your own, see the documentation. Also see the executive summary and publication list.

About

Fault injection library

Resources

Stars

23 stars

Watchers

21 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - dslab-epfl/lfi: Fault injection library · GitHub
Skip to content

Repository files navigation

Library-level Fault Injection Toolkit

LFI automatically identifies the errors exposed by shared libraries, finds potentially buggy error recovery code in program binaries, and produces corresponding injection scenarios. LFI injects the desired faults – in the form of error return codes and corresponding side effects – at the boundary between shared libraries and applications.

Installation

git clone https://github.com/dslab-epfl/lfi.git
cd lfi && make

###Dependencies

  • gcc/clang
  • libxml-dev (or libxml-devel)

###Operating system LFI was tested on 64-bit MacOS and Linux systems. It should also work on their 32-bit counterparts.

Usage

./libfi <configuration file> [-t <subject executable>]

LFI comes with several example fault injection plans; we can use this one for a quick test:

###Basic scenario #1 ./libfi scenarios/sampleplan.xml -t /bin/ls

If everything is OK you should see ls running and failing with a "Bad file descriptor" error.

###Basic scenario #2 (MacOS)

./libfi -t /Applications/Safari.app/Contents/MacOS/Safari scenarios/macos.simple.xml

###Scenarion #3

Next we will try to inject a fault in the communication between the PostgreSQL client and the database. First, install PostgreSQL if you don't have it already (e.g., apt-get install postgresql on Ubuntu) and start the server. Start the PostgreSQL client by typing "psql" and set up a database with some data:

CREATE TABLE friends ( name VARCHAR(30), age INT );
INSERT INTO friends VALUES ('John', 24), ('Mary', 33), ('Bob', 42);
SELECT * FROM friends;
name | age
------+-----
John | 24
Mary | 33
Bob | 42
(3 rows)
\q

Quit the client and create a fault injection plan as follows (you can name it myplan.xml):

<?xml version="1.0" encoding="UTF-8"?>
<plan>
<trigger id="module_libpq" class="CallStackTrigger">
<args>
<frame>
<module>libpq.so.5.1</module>
</frame>
</args>
</trigger>
<trigger id="cc1" class="CallCountTrigger">
<args>
<callcount>3</callcount>
</args>
</trigger>
<function name="recv" retval="-1" errno="EBADF">
<triggerx ref="module_libpq" />
<triggerx ref="cc1" />
</function>
</plan>

This plan tells LFI to intercept the recv() function (which is a libc API call) and, on the 3rd call made by libpq to the function, inject a fault that returns value -1 and sets errno to EBADF. The scenario uses two triggers:

  • The callstack trigger module_libpq that makes the fault be injected only if the call is made from the libpq module. We use the libpq.so library here because the PostreSQL client uses libpq to communicate with the database.
  • The call count trigger cc1 that allows the injection to occur only at the 3rd call to the recv() function.

Now run LFI as follows

./libfi myplan.xml -t /usr/bin/psql

You should witness something like this


% psql
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
postgres=# select * from friends;
name | age ------+-----
John | 24
Mary | 33
Bob | 42
(3 rows)
postgres=# select * from friends;
could not receive data from server: Bad file descriptor
postgres=# select * from friends;
name | age ------+-----
John | 24
Mary | 33
Bob | 42

What is seen here is a fault that interferes with the PostgreSQL's client ability to receive the data from the server.

If you're wondering why the fault occurs on the 2nd call, it's because psql makes one call to recv() during startup; if you add that in, you will see that it is the 3rd time we use recv() that the fault is observed.

For further information about LFI, the available triggers and how to write your own, see the documentation. Also see the executive summary and publication list.

About

Fault injection library

Resources

Stars

23 stars

Watchers

21 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - dslab-epfl/lfi: Fault injection library · GitHub
Skip to content

Repository files navigation

Library-level Fault Injection Toolkit

LFI automatically identifies the errors exposed by shared libraries, finds potentially buggy error recovery code in program binaries, and produces corresponding injection scenarios. LFI injects the desired faults – in the form of error return codes and corresponding side effects – at the boundary between shared libraries and applications.

Installation

git clone https://github.com/dslab-epfl/lfi.git
cd lfi && make

###Dependencies

  • gcc/clang
  • libxml-dev (or libxml-devel)

###Operating system LFI was tested on 64-bit MacOS and Linux systems. It should also work on their 32-bit counterparts.

Usage

./libfi <configuration file> [-t <subject executable>]

LFI comes with several example fault injection plans; we can use this one for a quick test:

###Basic scenario #1 ./libfi scenarios/sampleplan.xml -t /bin/ls

If everything is OK you should see ls running and failing with a "Bad file descriptor" error.

###Basic scenario #2 (MacOS)

./libfi -t /Applications/Safari.app/Contents/MacOS/Safari scenarios/macos.simple.xml

###Scenarion #3

Next we will try to inject a fault in the communication between the PostgreSQL client and the database. First, install PostgreSQL if you don't have it already (e.g., apt-get install postgresql on Ubuntu) and start the server. Start the PostgreSQL client by typing "psql" and set up a database with some data:

CREATE TABLE friends ( name VARCHAR(30), age INT );
INSERT INTO friends VALUES ('John', 24), ('Mary', 33), ('Bob', 42);
SELECT * FROM friends;
name | age
------+-----
John | 24
Mary | 33
Bob | 42
(3 rows)
\q

Quit the client and create a fault injection plan as follows (you can name it myplan.xml):

<?xml version="1.0" encoding="UTF-8"?>
<plan>
<trigger id="module_libpq" class="CallStackTrigger">
<args>
<frame>
<module>libpq.so.5.1</module>
</frame>
</args>
</trigger>
<trigger id="cc1" class="CallCountTrigger">
<args>
<callcount>3</callcount>
</args>
</trigger>
<function name="recv" retval="-1" errno="EBADF">
<triggerx ref="module_libpq" />
<triggerx ref="cc1" />
</function>
</plan>

This plan tells LFI to intercept the recv() function (which is a libc API call) and, on the 3rd call made by libpq to the function, inject a fault that returns value -1 and sets errno to EBADF. The scenario uses two triggers:

  • The callstack trigger module_libpq that makes the fault be injected only if the call is made from the libpq module. We use the libpq.so library here because the PostreSQL client uses libpq to communicate with the database.
  • The call count trigger cc1 that allows the injection to occur only at the 3rd call to the recv() function.

Now run LFI as follows

./libfi myplan.xml -t /usr/bin/psql

You should witness something like this


% psql
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
postgres=# select * from friends;
name | age ------+-----
John | 24
Mary | 33
Bob | 42
(3 rows)
postgres=# select * from friends;
could not receive data from server: Bad file descriptor
postgres=# select * from friends;
name | age ------+-----
John | 24
Mary | 33
Bob | 42

What is seen here is a fault that interferes with the PostgreSQL's client ability to receive the data from the server.

If you're wondering why the fault occurs on the 2nd call, it's because psql makes one call to recv() during startup; if you add that in, you will see that it is the 3rd time we use recv() that the fault is observed.

For further information about LFI, the available triggers and how to write your own, see the documentation. Also see the executive summary and publication list.

About

Fault injection library

Resources

Stars

23 stars

Watchers

21 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - dslab-epfl/lfi: Fault injection library · GitHub
Skip to content

Repository files navigation

Library-level Fault Injection Toolkit

LFI automatically identifies the errors exposed by shared libraries, finds potentially buggy error recovery code in program binaries, and produces corresponding injection scenarios. LFI injects the desired faults – in the form of error return codes and corresponding side effects – at the boundary between shared libraries and applications.

Installation

git clone https://github.com/dslab-epfl/lfi.git
cd lfi && make

###Dependencies

  • gcc/clang
  • libxml-dev (or libxml-devel)

###Operating system LFI was tested on 64-bit MacOS and Linux systems. It should also work on their 32-bit counterparts.

Usage

./libfi <configuration file> [-t <subject executable>]

LFI comes with several example fault injection plans; we can use this one for a quick test:

###Basic scenario #1 ./libfi scenarios/sampleplan.xml -t /bin/ls

If everything is OK you should see ls running and failing with a "Bad file descriptor" error.

###Basic scenario #2 (MacOS)

./libfi -t /Applications/Safari.app/Contents/MacOS/Safari scenarios/macos.simple.xml

###Scenarion #3

Next we will try to inject a fault in the communication between the PostgreSQL client and the database. First, install PostgreSQL if you don't have it already (e.g., apt-get install postgresql on Ubuntu) and start the server. Start the PostgreSQL client by typing "psql" and set up a database with some data:

CREATE TABLE friends ( name VARCHAR(30), age INT );
INSERT INTO friends VALUES ('John', 24), ('Mary', 33), ('Bob', 42);
SELECT * FROM friends;
name | age
------+-----
John | 24
Mary | 33
Bob | 42
(3 rows)
\q

Quit the client and create a fault injection plan as follows (you can name it myplan.xml):

<?xml version="1.0" encoding="UTF-8"?>
<plan>
<trigger id="module_libpq" class="CallStackTrigger">
<args>
<frame>
<module>libpq.so.5.1</module>
</frame>
</args>
</trigger>
<trigger id="cc1" class="CallCountTrigger">
<args>
<callcount>3</callcount>
</args>
</trigger>
<function name="recv" retval="-1" errno="EBADF">
<triggerx ref="module_libpq" />
<triggerx ref="cc1" />
</function>
</plan>

This plan tells LFI to intercept the recv() function (which is a libc API call) and, on the 3rd call made by libpq to the function, inject a fault that returns value -1 and sets errno to EBADF. The scenario uses two triggers:

  • The callstack trigger module_libpq that makes the fault be injected only if the call is made from the libpq module. We use the libpq.so library here because the PostreSQL client uses libpq to communicate with the database.
  • The call count trigger cc1 that allows the injection to occur only at the 3rd call to the recv() function.

Now run LFI as follows

./libfi myplan.xml -t /usr/bin/psql

You should witness something like this


% psql
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
postgres=# select * from friends;
name | age ------+-----
John | 24
Mary | 33
Bob | 42
(3 rows)
postgres=# select * from friends;
could not receive data from server: Bad file descriptor
postgres=# select * from friends;
name | age ------+-----
John | 24
Mary | 33
Bob | 42

What is seen here is a fault that interferes with the PostgreSQL's client ability to receive the data from the server.

If you're wondering why the fault occurs on the 2nd call, it's because psql makes one call to recv() during startup; if you add that in, you will see that it is the 3rd time we use recv() that the fault is observed.

For further information about LFI, the available triggers and how to write your own, see the documentation. Also see the executive summary and publication list.

About

Fault injection library

Resources

Stars

23 stars

Watchers

21 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - dslab-epfl/lfi: Fault injection library · GitHub
Skip to content

Repository files navigation

Library-level Fault Injection Toolkit

LFI automatically identifies the errors exposed by shared libraries, finds potentially buggy error recovery code in program binaries, and produces corresponding injection scenarios. LFI injects the desired faults – in the form of error return codes and corresponding side effects – at the boundary between shared libraries and applications.

Installation

git clone https://github.com/dslab-epfl/lfi.git
cd lfi && make

###Dependencies

  • gcc/clang
  • libxml-dev (or libxml-devel)

###Operating system LFI was tested on 64-bit MacOS and Linux systems. It should also work on their 32-bit counterparts.

Usage

./libfi <configuration file> [-t <subject executable>]

LFI comes with several example fault injection plans; we can use this one for a quick test:

###Basic scenario #1 ./libfi scenarios/sampleplan.xml -t /bin/ls

If everything is OK you should see ls running and failing with a "Bad file descriptor" error.

###Basic scenario #2 (MacOS)

./libfi -t /Applications/Safari.app/Contents/MacOS/Safari scenarios/macos.simple.xml

###Scenarion #3

Next we will try to inject a fault in the communication between the PostgreSQL client and the database. First, install PostgreSQL if you don't have it already (e.g., apt-get install postgresql on Ubuntu) and start the server. Start the PostgreSQL client by typing "psql" and set up a database with some data:

CREATE TABLE friends ( name VARCHAR(30), age INT );
INSERT INTO friends VALUES ('John', 24), ('Mary', 33), ('Bob', 42);
SELECT * FROM friends;
name | age
------+-----
John | 24
Mary | 33
Bob | 42
(3 rows)
\q

Quit the client and create a fault injection plan as follows (you can name it myplan.xml):

<?xml version="1.0" encoding="UTF-8"?>
<plan>
<trigger id="module_libpq" class="CallStackTrigger">
<args>
<frame>
<module>libpq.so.5.1</module>
</frame>
</args>
</trigger>
<trigger id="cc1" class="CallCountTrigger">
<args>
<callcount>3</callcount>
</args>
</trigger>
<function name="recv" retval="-1" errno="EBADF">
<triggerx ref="module_libpq" />
<triggerx ref="cc1" />
</function>
</plan>

This plan tells LFI to intercept the recv() function (which is a libc API call) and, on the 3rd call made by libpq to the function, inject a fault that returns value -1 and sets errno to EBADF. The scenario uses two triggers:

  • The callstack trigger module_libpq that makes the fault be injected only if the call is made from the libpq module. We use the libpq.so library here because the PostreSQL client uses libpq to communicate with the database.
  • The call count trigger cc1 that allows the injection to occur only at the 3rd call to the recv() function.

Now run LFI as follows

./libfi myplan.xml -t /usr/bin/psql

You should witness something like this


% psql
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
postgres=# select * from friends;
name | age ------+-----
John | 24
Mary | 33
Bob | 42
(3 rows)
postgres=# select * from friends;
could not receive data from server: Bad file descriptor
postgres=# select * from friends;
name | age ------+-----
John | 24
Mary | 33
Bob | 42

What is seen here is a fault that interferes with the PostgreSQL's client ability to receive the data from the server.

If you're wondering why the fault occurs on the 2nd call, it's because psql makes one call to recv() during startup; if you add that in, you will see that it is the 3rd time we use recv() that the fault is observed.

For further information about LFI, the available triggers and how to write your own, see the documentation. Also see the executive summary and publication list.

About

Fault injection library

Resources

Stars

23 stars

Watchers

21 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - dslab-epfl/lfi: Fault injection library · GitHub
Skip to content

Repository files navigation

Library-level Fault Injection Toolkit

LFI automatically identifies the errors exposed by shared libraries, finds potentially buggy error recovery code in program binaries, and produces corresponding injection scenarios. LFI injects the desired faults – in the form of error return codes and corresponding side effects – at the boundary between shared libraries and applications.

Installation

git clone https://github.com/dslab-epfl/lfi.git
cd lfi && make

###Dependencies

  • gcc/clang
  • libxml-dev (or libxml-devel)

###Operating system LFI was tested on 64-bit MacOS and Linux systems. It should also work on their 32-bit counterparts.

Usage

./libfi <configuration file> [-t <subject executable>]

LFI comes with several example fault injection plans; we can use this one for a quick test:

###Basic scenario #1 ./libfi scenarios/sampleplan.xml -t /bin/ls

If everything is OK you should see ls running and failing with a "Bad file descriptor" error.

###Basic scenario #2 (MacOS)

./libfi -t /Applications/Safari.app/Contents/MacOS/Safari scenarios/macos.simple.xml

###Scenarion #3

Next we will try to inject a fault in the communication between the PostgreSQL client and the database. First, install PostgreSQL if you don't have it already (e.g., apt-get install postgresql on Ubuntu) and start the server. Start the PostgreSQL client by typing "psql" and set up a database with some data:

CREATE TABLE friends ( name VARCHAR(30), age INT );
INSERT INTO friends VALUES ('John', 24), ('Mary', 33), ('Bob', 42);
SELECT * FROM friends;
name | age
------+-----
John | 24
Mary | 33
Bob | 42
(3 rows)
\q

Quit the client and create a fault injection plan as follows (you can name it myplan.xml):

<?xml version="1.0" encoding="UTF-8"?>
<plan>
<trigger id="module_libpq" class="CallStackTrigger">
<args>
<frame>
<module>libpq.so.5.1</module>
</frame>
</args>
</trigger>
<trigger id="cc1" class="CallCountTrigger">
<args>
<callcount>3</callcount>
</args>
</trigger>
<function name="recv" retval="-1" errno="EBADF">
<triggerx ref="module_libpq" />
<triggerx ref="cc1" />
</function>
</plan>

This plan tells LFI to intercept the recv() function (which is a libc API call) and, on the 3rd call made by libpq to the function, inject a fault that returns value -1 and sets errno to EBADF. The scenario uses two triggers:

  • The callstack trigger module_libpq that makes the fault be injected only if the call is made from the libpq module. We use the libpq.so library here because the PostreSQL client uses libpq to communicate with the database.
  • The call count trigger cc1 that allows the injection to occur only at the 3rd call to the recv() function.

Now run LFI as follows

./libfi myplan.xml -t /usr/bin/psql

You should witness something like this


% psql
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
postgres=# select * from friends;
name | age ------+-----
John | 24
Mary | 33
Bob | 42
(3 rows)
postgres=# select * from friends;
could not receive data from server: Bad file descriptor
postgres=# select * from friends;
name | age ------+-----
John | 24
Mary | 33
Bob | 42

What is seen here is a fault that interferes with the PostgreSQL's client ability to receive the data from the server.

If you're wondering why the fault occurs on the 2nd call, it's because psql makes one call to recv() during startup; if you add that in, you will see that it is the 3rd time we use recv() that the fault is observed.

For further information about LFI, the available triggers and how to write your own, see the documentation. Also see the executive summary and publication list.

About

Fault injection library

Resources

Stars

23 stars

Watchers

21 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - dslab-epfl/lfi: Fault injection library · GitHub
Skip to content

Repository files navigation

Library-level Fault Injection Toolkit

LFI automatically identifies the errors exposed by shared libraries, finds potentially buggy error recovery code in program binaries, and produces corresponding injection scenarios. LFI injects the desired faults – in the form of error return codes and corresponding side effects – at the boundary between shared libraries and applications.

Installation

git clone https://github.com/dslab-epfl/lfi.git
cd lfi && make

###Dependencies

  • gcc/clang
  • libxml-dev (or libxml-devel)

###Operating system LFI was tested on 64-bit MacOS and Linux systems. It should also work on their 32-bit counterparts.

Usage

./libfi <configuration file> [-t <subject executable>]

LFI comes with several example fault injection plans; we can use this one for a quick test:

###Basic scenario #1 ./libfi scenarios/sampleplan.xml -t /bin/ls

If everything is OK you should see ls running and failing with a "Bad file descriptor" error.

###Basic scenario #2 (MacOS)

./libfi -t /Applications/Safari.app/Contents/MacOS/Safari scenarios/macos.simple.xml

###Scenarion #3

Next we will try to inject a fault in the communication between the PostgreSQL client and the database. First, install PostgreSQL if you don't have it already (e.g., apt-get install postgresql on Ubuntu) and start the server. Start the PostgreSQL client by typing "psql" and set up a database with some data:

CREATE TABLE friends ( name VARCHAR(30), age INT );
INSERT INTO friends VALUES ('John', 24), ('Mary', 33), ('Bob', 42);
SELECT * FROM friends;
name | age
------+-----
John | 24
Mary | 33
Bob | 42
(3 rows)
\q

Quit the client and create a fault injection plan as follows (you can name it myplan.xml):

<?xml version="1.0" encoding="UTF-8"?>
<plan>
<trigger id="module_libpq" class="CallStackTrigger">
<args>
<frame>
<module>libpq.so.5.1</module>
</frame>
</args>
</trigger>
<trigger id="cc1" class="CallCountTrigger">
<args>
<callcount>3</callcount>
</args>
</trigger>
<function name="recv" retval="-1" errno="EBADF">
<triggerx ref="module_libpq" />
<triggerx ref="cc1" />
</function>
</plan>

This plan tells LFI to intercept the recv() function (which is a libc API call) and, on the 3rd call made by libpq to the function, inject a fault that returns value -1 and sets errno to EBADF. The scenario uses two triggers:

  • The callstack trigger module_libpq that makes the fault be injected only if the call is made from the libpq module. We use the libpq.so library here because the PostreSQL client uses libpq to communicate with the database.
  • The call count trigger cc1 that allows the injection to occur only at the 3rd call to the recv() function.

Now run LFI as follows

./libfi myplan.xml -t /usr/bin/psql

You should witness something like this


% psql
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
postgres=# select * from friends;
name | age ------+-----
John | 24
Mary | 33
Bob | 42
(3 rows)
postgres=# select * from friends;
could not receive data from server: Bad file descriptor
postgres=# select * from friends;
name | age ------+-----
John | 24
Mary | 33
Bob | 42

What is seen here is a fault that interferes with the PostgreSQL's client ability to receive the data from the server.

If you're wondering why the fault occurs on the 2nd call, it's because psql makes one call to recv() during startup; if you add that in, you will see that it is the 3rd time we use recv() that the fault is observed.

For further information about LFI, the available triggers and how to write your own, see the documentation. Also see the executive summary and publication list.

About

Fault injection library

Resources

Stars

23 stars

Watchers

21 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - dslab-epfl/lfi: Fault injection library · GitHub
Skip to content

Repository files navigation

Library-level Fault Injection Toolkit

LFI automatically identifies the errors exposed by shared libraries, finds potentially buggy error recovery code in program binaries, and produces corresponding injection scenarios. LFI injects the desired faults – in the form of error return codes and corresponding side effects – at the boundary between shared libraries and applications.

Installation

git clone https://github.com/dslab-epfl/lfi.git
cd lfi && make

###Dependencies

  • gcc/clang
  • libxml-dev (or libxml-devel)

###Operating system LFI was tested on 64-bit MacOS and Linux systems. It should also work on their 32-bit counterparts.

Usage

./libfi <configuration file> [-t <subject executable>]

LFI comes with several example fault injection plans; we can use this one for a quick test:

###Basic scenario #1 ./libfi scenarios/sampleplan.xml -t /bin/ls

If everything is OK you should see ls running and failing with a "Bad file descriptor" error.

###Basic scenario #2 (MacOS)

./libfi -t /Applications/Safari.app/Contents/MacOS/Safari scenarios/macos.simple.xml

###Scenarion #3

Next we will try to inject a fault in the communication between the PostgreSQL client and the database. First, install PostgreSQL if you don't have it already (e.g., apt-get install postgresql on Ubuntu) and start the server. Start the PostgreSQL client by typing "psql" and set up a database with some data:

CREATE TABLE friends ( name VARCHAR(30), age INT );
INSERT INTO friends VALUES ('John', 24), ('Mary', 33), ('Bob', 42);
SELECT * FROM friends;
name | age
------+-----
John | 24
Mary | 33
Bob | 42
(3 rows)
\q

Quit the client and create a fault injection plan as follows (you can name it myplan.xml):

<?xml version="1.0" encoding="UTF-8"?>
<plan>
<trigger id="module_libpq" class="CallStackTrigger">
<args>
<frame>
<module>libpq.so.5.1</module>
</frame>
</args>
</trigger>
<trigger id="cc1" class="CallCountTrigger">
<args>
<callcount>3</callcount>
</args>
</trigger>
<function name="recv" retval="-1" errno="EBADF">
<triggerx ref="module_libpq" />
<triggerx ref="cc1" />
</function>
</plan>

This plan tells LFI to intercept the recv() function (which is a libc API call) and, on the 3rd call made by libpq to the function, inject a fault that returns value -1 and sets errno to EBADF. The scenario uses two triggers:

  • The callstack trigger module_libpq that makes the fault be injected only if the call is made from the libpq module. We use the libpq.so library here because the PostreSQL client uses libpq to communicate with the database.
  • The call count trigger cc1 that allows the injection to occur only at the 3rd call to the recv() function.

Now run LFI as follows

./libfi myplan.xml -t /usr/bin/psql

You should witness something like this


% psql
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
postgres=# select * from friends;
name | age ------+-----
John | 24
Mary | 33
Bob | 42
(3 rows)
postgres=# select * from friends;
could not receive data from server: Bad file descriptor
postgres=# select * from friends;
name | age ------+-----
John | 24
Mary | 33
Bob | 42

What is seen here is a fault that interferes with the PostgreSQL's client ability to receive the data from the server.

If you're wondering why the fault occurs on the 2nd call, it's because psql makes one call to recv() during startup; if you add that in, you will see that it is the 3rd time we use recv() that the fault is observed.

For further information about LFI, the available triggers and how to write your own, see the documentation. Also see the executive summary and publication list.

About

Fault injection library

Resources

Stars

23 stars

Watchers

21 watching

Forks

Releases

Packages

Contributors

Languages