From 468a999134d29365e7ce5ee20099083d64164a35 Mon Sep 17 00:00:00 2001 From: Darya Parygina Date: Mon, 17 Feb 2025 17:52:37 +0300 Subject: [PATCH 01/11] Add casr-lua to casr-libfuzzer --- casr/src/bin/casr-libfuzzer.rs | 10 +++++++++- casr/src/triage.rs | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/casr/src/bin/casr-libfuzzer.rs b/casr/src/bin/casr-libfuzzer.rs index f484b620..d7f7f544 100644 --- a/casr/src/bin/casr-libfuzzer.rs +++ b/casr/src/bin/casr-libfuzzer.rs @@ -161,6 +161,14 @@ fn main() -> Result<()> { || argv[0].ends_with("jsfuzz")) { "casr-js" + } else if hint == "lua" + || hint == "auto" + && (argv[0].ends_with(".lua") + || argv[0] == "lua" + || argv[0] == "luajit" + || argv.len() > 1 && argv[1].ends_with(".lua")) + { + "casr-lua" } else { let sym_list = util::symbols_list(Path::new(argv[0]))?; if hint == "san" @@ -203,7 +211,7 @@ fn main() -> Result<()> { // Get input file argument index. let at_index = if let Some(idx) = argv.iter().skip(1).position(|s| s.contains("@@")) { Some(idx + 1) - } else if is_libafl_based { + } else if is_libafl_based || tool.eq("casr-lua") { None } else { argv.push("@@"); diff --git a/casr/src/triage.rs b/casr/src/triage.rs index 7c241fd2..910537b8 100644 --- a/casr/src/triage.rs +++ b/casr/src/triage.rs @@ -51,7 +51,7 @@ impl<'a> CrashInfo { } else { args.push(format!("{}.casrep", report_path.display())); } - if self.at_index.is_none() { + if self.at_index.is_none() || self.at_index == Some(0) { args.push("--stdin".to_string()); args.push(self.path.to_str().unwrap().to_string()); } From 92632626d19e7a4c45630765c5403d3377c52096 Mon Sep 17 00:00:00 2001 From: Darya Parygina Date: Wed, 5 Mar 2025 15:23:09 +0300 Subject: [PATCH 02/11] Add xml2lua test --- .github/workflows/amd64.yml | 6 +- .github/workflows/coverage.yaml | 6 +- .../001ae4daf6ab4e2c2b562a79b608e6eb5628ff66 | 3 + .../08c81694662536d2ef00a1995b34e25b397c6be2 | 6 + ...h-00392e7545ad23ce26c768fafa8c14291b91eec0 | Bin 0 -> 139 bytes ...h-00c984770c98536dc510ad22731f20854a350b01 | 2 + ...h-06d2814ffd0a9eb5be1199c7a522337efe29f805 | Bin 0 -> 587 bytes ...h-0c2577e1a76131d5d264c705734ce4f5a3225e94 | Bin 0 -> 363 bytes ...h-161cf7d38d7749f00c2cca6bf5f44a68804bbe0f | 119 ++++++++++++++++++ ...h-a922410c3705cb2a29c327dfae9d61d37ce7f7c3 | 6 + ...h-d1163148fd9697c9c2a99348fc01b65866d1dd8b | 1 + casr/tests/casr_tests/lua/stdin_parse_xml.lua | 33 +++++ casr/tests/casr_tests/lua/xml2lua.zip | Bin 0 -> 130528 bytes casr/tests/tests.rs | 119 ++++++++++++++++++ 14 files changed, 299 insertions(+), 2 deletions(-) create mode 100644 casr/tests/casr_tests/casrep/luzer_crashes_xml2lua/001ae4daf6ab4e2c2b562a79b608e6eb5628ff66 create mode 100644 casr/tests/casr_tests/casrep/luzer_crashes_xml2lua/08c81694662536d2ef00a1995b34e25b397c6be2 create mode 100644 casr/tests/casr_tests/casrep/luzer_crashes_xml2lua/crash-00392e7545ad23ce26c768fafa8c14291b91eec0 create mode 100644 casr/tests/casr_tests/casrep/luzer_crashes_xml2lua/crash-00c984770c98536dc510ad22731f20854a350b01 create mode 100644 casr/tests/casr_tests/casrep/luzer_crashes_xml2lua/crash-06d2814ffd0a9eb5be1199c7a522337efe29f805 create mode 100644 casr/tests/casr_tests/casrep/luzer_crashes_xml2lua/crash-0c2577e1a76131d5d264c705734ce4f5a3225e94 create mode 100644 casr/tests/casr_tests/casrep/luzer_crashes_xml2lua/crash-161cf7d38d7749f00c2cca6bf5f44a68804bbe0f create mode 100644 casr/tests/casr_tests/casrep/luzer_crashes_xml2lua/crash-a922410c3705cb2a29c327dfae9d61d37ce7f7c3 create mode 100644 casr/tests/casr_tests/casrep/luzer_crashes_xml2lua/crash-d1163148fd9697c9c2a99348fc01b65866d1dd8b create mode 100755 casr/tests/casr_tests/lua/stdin_parse_xml.lua create mode 100644 casr/tests/casr_tests/lua/xml2lua.zip diff --git a/.github/workflows/amd64.yml b/.github/workflows/amd64.yml index 5d460f13..9fa3f214 100644 --- a/.github/workflows/amd64.yml +++ b/.github/workflows/amd64.yml @@ -22,7 +22,11 @@ jobs: - name: Run tests run: | sudo apt update && sudo apt install -y gdb pip curl python3-dev llvm \ - openjdk-17-jdk ca-certificates gnupg lua5.4 + openjdk-17-jdk ca-certificates gnupg lua5.4 liblua5.4-dev + wget https://luarocks.org/releases/luarocks-3.11.1.tar.gz && tar zxpf luarocks-3.11.1.tar.gz && \ + cd luarocks-3.11.1 && ./configure && make && make install && cd .. && rm -rf luarocks-3.11.1.tar.gz luarocks-3.11.1 + git clone https://github.com/azanegin/luzer.git && \ + cd luzer && git checkout 77642ba37430eded66d171a68d7e9c3f6347d625 && luarocks build && cd .. && rm -rf luzer # Atheris fails to install on Ubuntu 24.04, see https://github.com/google/atheris/issues/82 # pip3 install atheris sudo mkdir -p /etc/apt/keyrings diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index f02ba453..e6e39923 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -19,7 +19,11 @@ jobs: - name: Install Dependences run: | sudo apt update && sudo apt install -y gdb pip curl python3-dev llvm \ - openjdk-17-jdk ca-certificates gnupg lua5.4 + openjdk-17-jdk ca-certificates gnupg lua5.4 liblua5.4-dev + wget https://luarocks.org/releases/luarocks-3.11.1.tar.gz && tar zxpf luarocks-3.11.1.tar.gz && \ + cd luarocks-3.11.1 && ./configure && make && make install && cd .. && rm -rf luarocks-3.11.1.tar.gz luarocks-3.11.1 + git clone https://github.com/azanegin/luzer.git && \ + cd luzer && git checkout 77642ba37430eded66d171a68d7e9c3f6347d625 && luarocks build && cd .. && rm -rf luzer pip3 install atheris sudo mkdir -p /etc/apt/keyrings curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg diff --git a/casr/tests/casr_tests/casrep/luzer_crashes_xml2lua/001ae4daf6ab4e2c2b562a79b608e6eb5628ff66 b/casr/tests/casr_tests/casrep/luzer_crashes_xml2lua/001ae4daf6ab4e2c2b562a79b608e6eb5628ff66 new file mode 100644 index 00000000..ff68be47 --- /dev/null +++ b/casr/tests/casr_tests/casrep/luzer_crashes_xml2lua/001ae4daf6ab4e2c2b562a79b608e6eb5628ff66 @@ -0,0 +1,3 @@ +yl< />/< +:/>< */>< +'>p \ No newline at end of file diff --git a/casr/tests/casr_tests/casrep/luzer_crashes_xml2lua/08c81694662536d2ef00a1995b34e25b397c6be2 b/casr/tests/casr_tests/casrep/luzer_crashes_xml2lua/08c81694662536d2ef00a1995b34e25b397c6be2 new file mode 100644 index 00000000..296ef238 --- /dev/null +++ b/casr/tests/casr_tests/casrep/luzer_crashes_xml2lua/08c81694662536d2ef00a1995b34e25b397c6be2 @@ -0,0 +1,6 @@ +<>,/< +>/,< />>< />//<>>P< + />,< />/< +>/,< />/< +>/<>>P<>Q< +>/<>>P> \ No newline at end of file diff --git a/casr/tests/casr_tests/casrep/luzer_crashes_xml2lua/crash-00392e7545ad23ce26c768fafa8c14291b91eec0 b/casr/tests/casr_tests/casrep/luzer_crashes_xml2lua/crash-00392e7545ad23ce26c768fafa8c14291b91eec0 new file mode 100644 index 0000000000000000000000000000000000000000..5112a640672f12dc6d8466d1a85431d401dd933d GIT binary patch literal 139 zcmcDqDJZD2wO7isQ?SWRt}Lm{w6hCH&MdLCGx4{vo5!VKXBU*5*}wn+C6#uj{#66m9HGZ1e1F>@ds#sx-i=m&?djNy(0j0RSsJ BCQy> + diff --git a/casr/tests/casr_tests/casrep/luzer_crashes_xml2lua/crash-06d2814ffd0a9eb5be1199c7a522337efe29f805 b/casr/tests/casr_tests/casrep/luzer_crashes_xml2lua/crash-06d2814ffd0a9eb5be1199c7a522337efe29f805 new file mode 100644 index 0000000000000000000000000000000000000000..1b5a18bf22083869b5b5892c3a33093d5fa38bb2 GIT binary patch literal 587 zcmb7?y$ZrG6ovIsEVu}@CYx{@7wOu?Md%VFLm`+uWC`>!`aZsqF77c+6HKdv77D#^ zf4*~0PfY{bLR&Bp?tK;jh~*&@gplI}bcI5pu8eCKz9g5{5&@(w6fPK^d(Z__IXl%* zDlTc#8aMdav=BAS=Ip=E%?(KMTRCc6IXh=^dhFkr>$Yma28U%GB8NXY#HLT&^;VY&M2&? X9upo{ehY0LFqobDLCn78#zFvC00|?lG|P4>uTa)T< +p/>Q>< />>

pe= s/>><)l>< + p/>e< < + p/> < + p/>ell < + />q/>n)e= 2iy$ <>e < + p/>el < + />el/>< +:p/>>>< + 4/>Q< +/>/<: + p,> < +>/<>>< + +>e<"/>/< + p/>e /šq/>/< +:p/>>< + + p3/>Qe < + p/>>< + p/>e< < + p/> < + pšq/>/< +:p/>>< + + p3/>Q<<> e + p/>>< + p/>e< < + p/> < + p/>el>< + + p3/>Q<> p/>el<>>< + p/>e< />q/<3/Ma>n)e= 2iy$ <>e < + p/>el < + />el/>< +:p/>>e /šq/>/< +:p/>>< + + <>Q3/p>e < + p/>>< + p/>e< < + p/> < + pšq/>/< +:p/>>< + + p3/>Q<<> e + p/>>< + p/>e< < + p/> < + p/>el

Q< />>

< + ep/>>< + p/> < + p/>ell < + />q/>n)e= 2iy$ <>e < + p/>el < + />el/>< +:p/>>>< + 4/>Q< +/>/<: + p,> < +>/<>>< + +>e<"/>/< + p/>e /šq/>/< +:p/>>< + + p3/>Qe < + p/>>< + p/>e< < + p/> < + pšq/>/< +:p/>>< + + p3/>Q<<> e + p/>>< + p/>e< < + p/> < + p/>el/>>< + + p3/>Q<> p/>el<>>< + p/>e< />q/<3/Ma>n)e= 2iy$ <>e < + p/>el < + />el/>< +:p/>>e /šq/>/< +:p/>>< + + p3/>Q<>e < + p/>>< + p/>e< < + p/> < + pšq/>/< +:p/>>< + + p3/>Q<<> e + p/>>< + p/>e< < + p/> < + p/>el

Q< />>

< + ee< < + p/> < + p/>el<>>< + p/>e< < + p/> < + pšq>< +:p/>>e /šq/>/< +:p/>/ />

Q< />>

< + ee< < + p/> < + p/>el<>>< + p/ p/>>< + p/>e< < + p/>> diff --git a/casr/tests/casr_tests/casrep/luzer_crashes_xml2lua/crash-a922410c3705cb2a29c327dfae9d61d37ce7f7c3 b/casr/tests/casr_tests/casrep/luzer_crashes_xml2lua/crash-a922410c3705cb2a29c327dfae9d61d37ce7f7c3 new file mode 100644 index 00000000..d80f3705 --- /dev/null +++ b/casr/tests/casr_tests/casrep/luzer_crashes_xml2lua/crash-a922410c3705cb2a29c327dfae9d61d37ce7f7c3 @@ -0,0 +1,6 @@ + <ۜ /> + +e <ۜ />/> <ۜ /> + +|m \ No newline at end of file diff --git a/casr/tests/casr_tests/lua/stdin_parse_xml.lua b/casr/tests/casr_tests/lua/stdin_parse_xml.lua new file mode 100755 index 00000000..2c72b567 --- /dev/null +++ b/casr/tests/casr_tests/lua/stdin_parse_xml.lua @@ -0,0 +1,33 @@ +#!/usr/bin/env lua +-- +-- Copyright 2025 ISP RAS +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-------------------------------------------------------------------------- + +local xml2lua = require("xml2lua") +local handler = require("xmlhandler.tree") +local luzer = require("luzer") + +local function TestOneInput(buf) + local fdp = luzer.FuzzedDataProvider(buf) + if #buf < 2 then return nil end + local str = fdp:consume_string(#buf - 1) + local parser = xml2lua.parser(handler) + parser:parse(str) +end + +local buf = io.read("*all") +if not buf then return nil end +TestOneInput(buf) diff --git a/casr/tests/casr_tests/lua/xml2lua.zip b/casr/tests/casr_tests/lua/xml2lua.zip new file mode 100644 index 0000000000000000000000000000000000000000..69f5906e772958927b081f04a85f7109e46c7141 GIT binary patch literal 130528 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 literal 0 HcmV?d00001 diff --git a/casr/tests/tests.rs b/casr/tests/tests.rs index 0eccf121..6497579c 100644 --- a/casr/tests/tests.rs +++ b/casr/tests/tests.rs @@ -5017,6 +5017,125 @@ fn test_casr_lua() { } } +#[test] +#[cfg(target_arch = "x86_64")] +fn test_casr_libfuzzer_luzer() { + use std::collections::HashMap; + + let paths = [ + abs_path("tests/casr_tests/casrep/luzer_crashes_xml2lua"), + abs_path("tests/tmp_tests_casr/test_casr_libfuzzer_luzer/casr_libfuzzer_luzer_out"), + abs_path("tests/tmp_tests_casr/test_casr_libfuzzer_luzer/stdin_parse_xml.lua"), + abs_path("tests/tmp_tests_casr/test_casr_libfuzzer_luzer/xml2lua"), + ]; + + let _ = fs::remove_dir_all(&paths[1]); + let _ = fs::remove_file(&paths[2]); + let _ = fs::remove_dir_all(&paths[3]); + let _ = fs::create_dir_all(abs_path("tests/tmp_tests_casr/test_casr_libfuzzer_luzer")); + + fs::copy( + abs_path("tests/casr_tests/lua/stdin_parse_xml.lua"), + &paths[2], + ) + .unwrap(); + + Command::new("unzip") + .arg(abs_path("tests/casr_tests/lua/xml2lua.zip")) + .current_dir(abs_path("tests/tmp_tests_casr/test_casr_libfuzzer_luzer")) + .stdout(Stdio::null()) + .status() + .expect("failed to unzip xml2lua.zip"); + + let Ok(luarocks_path) = which::which("luarocks") else { + panic!("No luarocks is found."); + }; + + let luarocks = Command::new(&luarocks_path) + .current_dir(&paths[3]) + .args(["--local", "build"]) + .output() + .expect("failed to run luarocks build"); + assert!( + luarocks.status.success(), + "Stdout: {}.\n Stderr: {}", + String::from_utf8_lossy(&luarocks.stdout), + String::from_utf8_lossy(&luarocks.stderr) + ); + + let bins = Path::new(EXE_CASR_LIBFUZZER).parent().unwrap(); + let mut cmd = Command::new(EXE_CASR_LIBFUZZER); + cmd.args(["-i", &paths[0], "-o", &paths[1], "--", &paths[2]]) + .env( + "PATH", + format!("{}:{}", bins.display(), std::env::var("PATH").unwrap()), + ); + let output = cmd.output().expect("failed to start casr-libfuzzer"); + + assert!( + output.status.success(), + "Stdout {}.\n Stderr: {}", + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr) + ); + let err = String::from_utf8_lossy(&output.stderr); + + assert!(!err.is_empty()); + + assert!(err.contains("NOT_EXPLOITABLE")); + assert!(err.contains("attempt to perform arithmetic on a nil value")); + assert!(err.contains("attempt to index a nil value")); + assert!(err.contains("bad argument #1 to 'insert'")); + assert!(err.contains("XmlParser.lua")); + assert!(err.contains("tree.lua")); + + let re = Regex::new(r"Number of reports after deduplication: (?P\d+)").unwrap(); + let unique_cnt = re + .captures(&err) + .unwrap() + .name("unique") + .map(|x| x.as_str()) + .unwrap() + .parse::() + .unwrap(); + + assert_eq!(unique_cnt, 3, "Invalid number of deduplicated reports"); + + let re = Regex::new(r"Number of clusters: (?P\d+)").unwrap(); + let clusters_cnt = re + .captures(&err) + .unwrap() + .name("clusters") + .map(|x| x.as_str()) + .unwrap() + .parse::() + .unwrap(); + + assert_eq!(clusters_cnt, 3, "Invalid number of clusters"); + + let mut storage: HashMap = HashMap::new(); + for entry in fs::read_dir(&paths[1]).unwrap() { + let e = entry.unwrap().path(); + let fname = e.file_name().unwrap().to_str().unwrap(); + if fname.starts_with("cl") && e.is_dir() { + for file in fs::read_dir(e).unwrap() { + let mut e = file.unwrap().path(); + if e.is_file() && e.extension().is_some() && e.extension().unwrap() == "casrep" { + e = e.with_extension(""); + } + let fname = e.file_name().unwrap().to_str().unwrap(); + if let Some(v) = storage.get_mut(fname) { + *v += 1; + } else { + storage.insert(fname.to_string(), 1); + } + } + } + } + + assert!(storage.values().all(|x| *x > 1)); +} + #[test] #[cfg(target_arch = "x86_64")] fn test_casr_js() { From cd55846297a06c2945f52bc352c9f4e55c34717f Mon Sep 17 00:00:00 2001 From: Darya Parygina Date: Fri, 7 Mar 2025 17:53:30 +0300 Subject: [PATCH 03/11] Fix CI --- .github/workflows/amd64.yml | 4 ++-- .github/workflows/coverage.yaml | 4 ++-- docs/usage.md | 11 ++++++++--- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/.github/workflows/amd64.yml b/.github/workflows/amd64.yml index 9fa3f214..ac112194 100644 --- a/.github/workflows/amd64.yml +++ b/.github/workflows/amd64.yml @@ -24,9 +24,9 @@ jobs: sudo apt update && sudo apt install -y gdb pip curl python3-dev llvm \ openjdk-17-jdk ca-certificates gnupg lua5.4 liblua5.4-dev wget https://luarocks.org/releases/luarocks-3.11.1.tar.gz && tar zxpf luarocks-3.11.1.tar.gz && \ - cd luarocks-3.11.1 && ./configure && make && make install && cd .. && rm -rf luarocks-3.11.1.tar.gz luarocks-3.11.1 + cd luarocks-3.11.1 && ./configure && make && sudo make install && cd .. && rm -rf luarocks-3.11.1.tar.gz luarocks-3.11.1 git clone https://github.com/azanegin/luzer.git && \ - cd luzer && git checkout 77642ba37430eded66d171a68d7e9c3f6347d625 && luarocks build && cd .. && rm -rf luzer + cd luzer && git checkout 77642ba37430eded66d171a68d7e9c3f6347d625 && luarocks --local build && cd .. && rm -rf luzer # Atheris fails to install on Ubuntu 24.04, see https://github.com/google/atheris/issues/82 # pip3 install atheris sudo mkdir -p /etc/apt/keyrings diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index e6e39923..25635e21 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -21,9 +21,9 @@ jobs: sudo apt update && sudo apt install -y gdb pip curl python3-dev llvm \ openjdk-17-jdk ca-certificates gnupg lua5.4 liblua5.4-dev wget https://luarocks.org/releases/luarocks-3.11.1.tar.gz && tar zxpf luarocks-3.11.1.tar.gz && \ - cd luarocks-3.11.1 && ./configure && make && make install && cd .. && rm -rf luarocks-3.11.1.tar.gz luarocks-3.11.1 + cd luarocks-3.11.1 && ./configure && make && sudo make install && cd .. && rm -rf luarocks-3.11.1.tar.gz luarocks-3.11.1 git clone https://github.com/azanegin/luzer.git && \ - cd luzer && git checkout 77642ba37430eded66d171a68d7e9c3f6347d625 && luarocks build && cd .. && rm -rf luzer + cd luzer && git checkout 77642ba37430eded66d171a68d7e9c3f6347d625 && luarocks --local build && cd .. && rm -rf luzer pip3 install atheris sudo mkdir -p /etc/apt/keyrings curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg diff --git a/docs/usage.md b/docs/usage.md index aced46a3..430b61fa 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -15,7 +15,7 @@ Use `casr-lua` to analyze Lua reports. `casr-afl` can triage crashes found by [AFL++](https://github.com/AFLplusplus/AFLplusplus) and AFL-based fuzzer [Sharpfuzz](https://github.com/Metalnem/sharpfuzz). `casr-libfuzzer` can triage crashes found by [libFuzzer](https://www.llvm.org/docs/LibFuzzer.html) -(libFuzzer, go-fuzz, Atheris, Jazzer, Jazzer.js, jsfuzz) or by +(libFuzzer, go-fuzz, Atheris, Jazzer, Jazzer.js, jsfuzz, luzer) or by [LibAFL](https://github.com/AFLplusplus/LibAFL) based [fuzzers](https://github.com/AFLplusplus/LibAFL/tree/main/fuzzers). `casr-dojo` allows to upload new and unique CASR reports to @@ -613,7 +613,7 @@ your project before (via `dotnet build` or `dotnet publish`) and specify `--no-b ## casr-libfuzzer Triage crashes found by libFuzzer based fuzzer -(C/C++/go-fuzz/Atheris/Jazzer/Jazzer.js/jsfuzz) or LibAFL based fuzzer +(C/C++/go-fuzz/Atheris/Jazzer/Jazzer.js/jsfuzz/luzer) or LibAFL based fuzzer Usage: casr-libfuzzer [OPTIONS] --output -- ... @@ -655,7 +655,8 @@ Triage crashes found by libFuzzer based fuzzer [libFuzzer](https://www.llvm.org/docs/LibFuzzer.html) based fuzzers (C/C++/[go-fuzz](https://github.com/dvyukov/go-fuzz)/[Atheris](https://github.com/google/atheris)/ [Jazzer](https://github.com/CodeIntelligenceTesting/jazzer)/[Jazzer.js](https://github.com/CodeIntelligenceTesting/jazzer.js)/ -[jsfuzz](https://github.com/fuzzitdev/jsfuzz)) or [LibAFL](https://github.com/AFLplusplus/LibAFL) based +[jsfuzz](https://github.com/fuzzitdev/jsfuzz)/[luzer](https://github.com/ligurio/luzer)) +or [LibAFL](https://github.com/AFLplusplus/LibAFL) based [fuzzers](https://github.com/AFLplusplus/LibAFL/tree/main/fuzzers). It is pretty much like `casr-afl`. @@ -682,6 +683,10 @@ Jazzer.js example (Jazzer.js installation [guide](https://github.com/CodeIntelli $ sudo npm install --save-dev @jazzer.js/core $ casr-libfuzzer -i ./xml2js -o casr/tests/tmp_tests_casr/xml2js_fuzzer_out/out -- npx jazzer casr/tests/tmp_tests_casr/xml2js_fuzzer_out/xml2js_fuzzer.js +Luzer example: + + $ casr-libfuzzer -i casr/tests/casr_tests/casrep/luzer_crashes_xml2lua -o casr/tests/tmp_tests_casr/casr_libfuzzer_luzer_out -- casr/tests/casr_tests/lua/stdin_parse_xml.lua + LibAFL example: $ casr-libfuzzer -i casr/tests/casr_tests/casrep/test_libafl_crashes -o casr/tests/tmp_tests_casr/casr_libafl_out -- casr/tests/casr_tests/bin/test_libafl_fuzzer @@ From 73ab28a69cac8af59277ceb418c8df9e03aebfb9 Mon Sep 17 00:00:00 2001 From: Darya Parygina Date: Fri, 7 Mar 2025 18:16:37 +0300 Subject: [PATCH 04/11] Test --- casr/tests/tests.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/casr/tests/tests.rs b/casr/tests/tests.rs index 6497579c..579a8ee5 100644 --- a/casr/tests/tests.rs +++ b/casr/tests/tests.rs @@ -5079,6 +5079,7 @@ fn test_casr_libfuzzer_luzer() { String::from_utf8_lossy(&output.stderr) ); let err = String::from_utf8_lossy(&output.stderr); +println!("{}", err); assert!(!err.is_empty()); From ef749222a84c55db65dcfaaf76c73f2bcfcf9ec5 Mon Sep 17 00:00:00 2001 From: Darya Parygina Date: Fri, 7 Mar 2025 18:32:57 +0300 Subject: [PATCH 05/11] Test --- .github/workflows/amd64.yml | 2 +- .github/workflows/coverage.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/amd64.yml b/.github/workflows/amd64.yml index ac112194..bd0a263e 100644 --- a/.github/workflows/amd64.yml +++ b/.github/workflows/amd64.yml @@ -22,7 +22,7 @@ jobs: - name: Run tests run: | sudo apt update && sudo apt install -y gdb pip curl python3-dev llvm \ - openjdk-17-jdk ca-certificates gnupg lua5.4 liblua5.4-dev + openjdk-17-jdk ca-certificates gnupg lua5.1 liblua5.1-dev wget https://luarocks.org/releases/luarocks-3.11.1.tar.gz && tar zxpf luarocks-3.11.1.tar.gz && \ cd luarocks-3.11.1 && ./configure && make && sudo make install && cd .. && rm -rf luarocks-3.11.1.tar.gz luarocks-3.11.1 git clone https://github.com/azanegin/luzer.git && \ diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index 25635e21..9a4f58f9 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -19,7 +19,7 @@ jobs: - name: Install Dependences run: | sudo apt update && sudo apt install -y gdb pip curl python3-dev llvm \ - openjdk-17-jdk ca-certificates gnupg lua5.4 liblua5.4-dev + openjdk-17-jdk ca-certificates gnupg lua5.1 liblua5.1-dev wget https://luarocks.org/releases/luarocks-3.11.1.tar.gz && tar zxpf luarocks-3.11.1.tar.gz && \ cd luarocks-3.11.1 && ./configure && make && sudo make install && cd .. && rm -rf luarocks-3.11.1.tar.gz luarocks-3.11.1 git clone https://github.com/azanegin/luzer.git && \ From 52bc9879e8fa991c8c2fb422c4ed1585e0522ed5 Mon Sep 17 00:00:00 2001 From: Darya Parygina Date: Fri, 7 Mar 2025 19:24:43 +0300 Subject: [PATCH 06/11] Fix --- .github/workflows/amd64.yml | 11 ++++++++--- .github/workflows/coverage.yaml | 11 ++++++++--- casr/tests/tests.rs | 6 +++--- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/.github/workflows/amd64.yml b/.github/workflows/amd64.yml index bd0a263e..5e0b3e36 100644 --- a/.github/workflows/amd64.yml +++ b/.github/workflows/amd64.yml @@ -22,11 +22,16 @@ jobs: - name: Run tests run: | sudo apt update && sudo apt install -y gdb pip curl python3-dev llvm \ - openjdk-17-jdk ca-certificates gnupg lua5.1 liblua5.1-dev + openjdk-17-jdk ca-certificates gnupg lua5.4 liblua5.4-dev libcurl4-gnutls-dev wget https://luarocks.org/releases/luarocks-3.11.1.tar.gz && tar zxpf luarocks-3.11.1.tar.gz && \ cd luarocks-3.11.1 && ./configure && make && sudo make install && cd .. && rm -rf luarocks-3.11.1.tar.gz luarocks-3.11.1 - git clone https://github.com/azanegin/luzer.git && \ - cd luzer && git checkout 77642ba37430eded66d171a68d7e9c3f6347d625 && luarocks --local build && cd .. && rm -rf luzer + eval $(luarocks path) + wget https://github.com/tarantool/luajit/archive/refs/tags/v2.1.0-beta3.tar.gz && \ + tar zxpf v2.1.0-beta3.tar.gz && rm v2.1.0-beta3.tar.gz && cd luajit-2.1.0-beta3 && \ + make && sudo make install && sudo ln -sf luajit-2.1.0-beta3 /usr/local/bin/luajit && cd .. && rm -rf luajit-2.1.0-beta3 + git clone https://github.com/ligurio/luzer.git && \ + cd luzer && git checkout 6e3276c5e6faf18c8c98637162bea0a23f0cd1d3 && luarocks --local build && cd .. && sudo rm -rf luzer + export LUA_CPATH="/home/runner/work/casr/casr/luzer/build.luarocks/luzer/?.so;$LUA_CPATH" # Atheris fails to install on Ubuntu 24.04, see https://github.com/google/atheris/issues/82 # pip3 install atheris sudo mkdir -p /etc/apt/keyrings diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index 9a4f58f9..ed0129e2 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -19,11 +19,16 @@ jobs: - name: Install Dependences run: | sudo apt update && sudo apt install -y gdb pip curl python3-dev llvm \ - openjdk-17-jdk ca-certificates gnupg lua5.1 liblua5.1-dev + openjdk-17-jdk ca-certificates gnupg lua5.4 liblua5.4-dev libcurl4-gnutls-dev wget https://luarocks.org/releases/luarocks-3.11.1.tar.gz && tar zxpf luarocks-3.11.1.tar.gz && \ cd luarocks-3.11.1 && ./configure && make && sudo make install && cd .. && rm -rf luarocks-3.11.1.tar.gz luarocks-3.11.1 - git clone https://github.com/azanegin/luzer.git && \ - cd luzer && git checkout 77642ba37430eded66d171a68d7e9c3f6347d625 && luarocks --local build && cd .. && rm -rf luzer + eval $(luarocks path) + wget https://github.com/tarantool/luajit/archive/refs/tags/v2.1.0-beta3.tar.gz && \ + tar zxpf v2.1.0-beta3.tar.gz && rm v2.1.0-beta3.tar.gz && cd luajit-2.1.0-beta3 && \ + make && sudo make install && sudo ln -sf luajit-2.1.0-beta3 /usr/local/bin/luajit && cd .. && rm -rf luajit-2.1.0-beta3 + git clone https://github.com/ligurio/luzer.git && \ + cd luzer && git checkout 6e3276c5e6faf18c8c98637162bea0a23f0cd1d3 && luarocks --local build && cd .. && sudo rm -rf luzer + export LUA_CPATH="/home/runner/work/casr/casr/luzer/build.luarocks/luzer/?.so;$LUA_CPATH" pip3 install atheris sudo mkdir -p /etc/apt/keyrings curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg diff --git a/casr/tests/tests.rs b/casr/tests/tests.rs index 579a8ee5..20179484 100644 --- a/casr/tests/tests.rs +++ b/casr/tests/tests.rs @@ -5079,13 +5079,13 @@ fn test_casr_libfuzzer_luzer() { String::from_utf8_lossy(&output.stderr) ); let err = String::from_utf8_lossy(&output.stderr); -println!("{}", err); + println!("{}", err); assert!(!err.is_empty()); assert!(err.contains("NOT_EXPLOITABLE")); - assert!(err.contains("attempt to perform arithmetic on a nil value")); - assert!(err.contains("attempt to index a nil value")); + assert!(err.contains("attempt to perform arithmetic")); + assert!(err.contains("attempt to index")); assert!(err.contains("bad argument #1 to 'insert'")); assert!(err.contains("XmlParser.lua")); assert!(err.contains("tree.lua")); From 97526eb713a29e7e13009ce0a740f0efb36bef65 Mon Sep 17 00:00:00 2001 From: Darya Parygina Date: Fri, 14 Mar 2025 19:41:25 +0300 Subject: [PATCH 07/11] Test --- .github/workflows/coverage.yaml | 18 +++++++++--------- casr/tests/tests.rs | 4 ++++ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index ed0129e2..53f2ef6e 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -20,15 +20,15 @@ jobs: run: | sudo apt update && sudo apt install -y gdb pip curl python3-dev llvm \ openjdk-17-jdk ca-certificates gnupg lua5.4 liblua5.4-dev libcurl4-gnutls-dev - wget https://luarocks.org/releases/luarocks-3.11.1.tar.gz && tar zxpf luarocks-3.11.1.tar.gz && \ - cd luarocks-3.11.1 && ./configure && make && sudo make install && cd .. && rm -rf luarocks-3.11.1.tar.gz luarocks-3.11.1 - eval $(luarocks path) - wget https://github.com/tarantool/luajit/archive/refs/tags/v2.1.0-beta3.tar.gz && \ - tar zxpf v2.1.0-beta3.tar.gz && rm v2.1.0-beta3.tar.gz && cd luajit-2.1.0-beta3 && \ - make && sudo make install && sudo ln -sf luajit-2.1.0-beta3 /usr/local/bin/luajit && cd .. && rm -rf luajit-2.1.0-beta3 - git clone https://github.com/ligurio/luzer.git && \ - cd luzer && git checkout 6e3276c5e6faf18c8c98637162bea0a23f0cd1d3 && luarocks --local build && cd .. && sudo rm -rf luzer - export LUA_CPATH="/home/runner/work/casr/casr/luzer/build.luarocks/luzer/?.so;$LUA_CPATH" + # wget https://luarocks.org/releases/luarocks-3.11.1.tar.gz && tar zxpf luarocks-3.11.1.tar.gz && \ + # cd luarocks-3.11.1 && ./configure && make && sudo make install && cd .. && rm -rf luarocks-3.11.1.tar.gz luarocks-3.11.1 + # eval $(luarocks path) + # wget https://github.com/tarantool/luajit/archive/refs/tags/v2.1.0-beta3.tar.gz && \ + # tar zxpf v2.1.0-beta3.tar.gz && rm v2.1.0-beta3.tar.gz && cd luajit-2.1.0-beta3 && \ + # make && sudo make install && sudo ln -sf luajit-2.1.0-beta3 /usr/local/bin/luajit && cd .. && rm -rf luajit-2.1.0-beta3 + # git clone https://github.com/ligurio/luzer.git && \ + # cd luzer && git checkout 6e3276c5e6faf18c8c98637162bea0a23f0cd1d3 && luarocks --local build && cd .. && sudo rm -rf luzer + # export LUA_CPATH="/home/runner/work/casr/casr/luzer/build.luarocks/luzer/?.so;$LUA_CPATH" pip3 install atheris sudo mkdir -p /etc/apt/keyrings curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg diff --git a/casr/tests/tests.rs b/casr/tests/tests.rs index 20179484..d06a16e8 100644 --- a/casr/tests/tests.rs +++ b/casr/tests/tests.rs @@ -5020,6 +5020,10 @@ fn test_casr_lua() { #[test] #[cfg(target_arch = "x86_64")] fn test_casr_libfuzzer_luzer() { + if lsb_release::info().unwrap().version != "24.04" { + return; + } + use std::collections::HashMap; let paths = [ From f60468dbd37c4cf3129ce220be9222b8c5f83ceb Mon Sep 17 00:00:00 2001 From: Darya Parygina Date: Tue, 18 Mar 2025 12:49:51 +0300 Subject: [PATCH 08/11] Update docs --- .github/workflows/amd64.yml | 2 +- .github/workflows/coverage.yaml | 2 +- README.md | 11 ++++++++++- docs/usage.md | 4 ++++ 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/.github/workflows/amd64.yml b/.github/workflows/amd64.yml index 5e0b3e36..ec5e4caf 100644 --- a/.github/workflows/amd64.yml +++ b/.github/workflows/amd64.yml @@ -30,7 +30,7 @@ jobs: tar zxpf v2.1.0-beta3.tar.gz && rm v2.1.0-beta3.tar.gz && cd luajit-2.1.0-beta3 && \ make && sudo make install && sudo ln -sf luajit-2.1.0-beta3 /usr/local/bin/luajit && cd .. && rm -rf luajit-2.1.0-beta3 git clone https://github.com/ligurio/luzer.git && \ - cd luzer && git checkout 6e3276c5e6faf18c8c98637162bea0a23f0cd1d3 && luarocks --local build && cd .. && sudo rm -rf luzer + cd luzer && git checkout 6e3276c5e6faf18c8c98637162bea0a23f0cd1d3 && luarocks --local build && cd .. export LUA_CPATH="/home/runner/work/casr/casr/luzer/build.luarocks/luzer/?.so;$LUA_CPATH" # Atheris fails to install on Ubuntu 24.04, see https://github.com/google/atheris/issues/82 # pip3 install atheris diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index 53f2ef6e..55bf3115 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -27,7 +27,7 @@ jobs: # tar zxpf v2.1.0-beta3.tar.gz && rm v2.1.0-beta3.tar.gz && cd luajit-2.1.0-beta3 && \ # make && sudo make install && sudo ln -sf luajit-2.1.0-beta3 /usr/local/bin/luajit && cd .. && rm -rf luajit-2.1.0-beta3 # git clone https://github.com/ligurio/luzer.git && \ - # cd luzer && git checkout 6e3276c5e6faf18c8c98637162bea0a23f0cd1d3 && luarocks --local build && cd .. && sudo rm -rf luzer + # cd luzer && git checkout 6e3276c5e6faf18c8c98637162bea0a23f0cd1d3 && luarocks --local build && cd .. # export LUA_CPATH="/home/runner/work/casr/casr/luzer/build.luarocks/luzer/?.so;$LUA_CPATH" pip3 install atheris sudo mkdir -p /etc/apt/keyrings diff --git a/README.md b/README.md index 02c72bbd..7b5285c2 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,8 @@ and AFL-based fuzzer [Sharpfuzz](https://github.com/Metalnem/sharpfuzz). [libFuzzer](https://www.llvm.org/docs/LibFuzzer.html) based fuzzer (C/C++/[go-fuzz](https://github.com/dvyukov/go-fuzz)/[Atheris](https://github.com/google/atheris) /[Jazzer](https://github.com/CodeIntelligenceTesting/jazzer)/[Jazzer.js](https://github.com/CodeIntelligenceTesting/jazzer.js)/ -[jsfuzz](https://github.com/fuzzitdev/jsfuzz)) or [LibAFL](https://github.com/AFLplusplus/LibAFL) +[jsfuzz](https://github.com/fuzzitdev/jsfuzz)/[luzer](https://github.com/ligurio/luzer)) +or [LibAFL](https://github.com/AFLplusplus/LibAFL) based [fuzzers](https://github.com/AFLplusplus/LibAFL/tree/main/fuzzers). `casr-dojo` allows to upload new and unique CASR reports to [DefectDojo](https://github.com/DefectDojo/django-DefectDojo) (available with @@ -242,6 +243,14 @@ Triage Jazzer.js crashes with casr-libfuzzer (Jazzer.js installation [guide](htt $ sudo npm install --save-dev @jazzer.js/core $ casr-libfuzzer -i ./xml2js -o casr/tests/tmp_tests_casr/xml2js_fuzzer_out/out -- npx jazzer casr/tests/tmp_tests_casr/xml2js_fuzzer_out/xml2js_fuzzer.js +Triage luzer crashes with casr-libfuzzer: + + $ unzip casr/tests/casr_tests/lua/xml2lua.zip && cd xml2lua && luarocks --local build && cd .. && rm -rf xml2lua + $ git clone https://github.com/azanegin/luzer.git && \ + cd luzer && git checkout 77642ba37430eded66d171a68d7e9c3f6347d625 && luarocks --local build && cd .. && rm -rf luzer + $ mkdir -p casr/tests/tmp_tests_casr/casr_libfuzzer_luzer_out + $ casr-libfuzzer -i casr/tests/casr_tests/casrep/luzer_crashes_xml2lua -o casr/tests/tmp_tests_casr/casr_libfuzzer_luzer_out -- casr/tests/casr_tests/lua/stdin_parse_xml.lua + Triage LibAFL crashes with casr-libfuzzer: $ casr-libfuzzer -i casr/tests/casr_tests/casrep/test_libafl_crashes -o casr/tests/tmp_tests_casr/casr_libafl_out -- casr/tests/casr_tests/bin/test_libafl_fuzzer @@ diff --git a/docs/usage.md b/docs/usage.md index 430b61fa..c0647775 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -685,6 +685,10 @@ Jazzer.js example (Jazzer.js installation [guide](https://github.com/CodeIntelli Luzer example: + $ unzip casr/tests/casr_tests/lua/xml2lua.zip && cd xml2lua && luarocks --local build && cd .. && rm -rf xml2lua + $ git clone https://github.com/azanegin/luzer.git && \ + cd luzer && git checkout 77642ba37430eded66d171a68d7e9c3f6347d625 && luarocks --local build && cd .. && rm -rf luzer + $ mkdir -p casr/tests/tmp_tests_casr/casr_libfuzzer_luzer_out $ casr-libfuzzer -i casr/tests/casr_tests/casrep/luzer_crashes_xml2lua -o casr/tests/tmp_tests_casr/casr_libfuzzer_luzer_out -- casr/tests/casr_tests/lua/stdin_parse_xml.lua LibAFL example: From bd3f4f4ee1dacfd691ed26e28ed564b85845de19 Mon Sep 17 00:00:00 2001 From: Darya Parygina Date: Tue, 18 Mar 2025 13:30:14 +0300 Subject: [PATCH 09/11] Test coverage --- .github/workflows/coverage.yaml | 18 +++++++++--------- casr/tests/tests.rs | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index 55bf3115..dd998ae3 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -20,15 +20,15 @@ jobs: run: | sudo apt update && sudo apt install -y gdb pip curl python3-dev llvm \ openjdk-17-jdk ca-certificates gnupg lua5.4 liblua5.4-dev libcurl4-gnutls-dev - # wget https://luarocks.org/releases/luarocks-3.11.1.tar.gz && tar zxpf luarocks-3.11.1.tar.gz && \ - # cd luarocks-3.11.1 && ./configure && make && sudo make install && cd .. && rm -rf luarocks-3.11.1.tar.gz luarocks-3.11.1 - # eval $(luarocks path) - # wget https://github.com/tarantool/luajit/archive/refs/tags/v2.1.0-beta3.tar.gz && \ - # tar zxpf v2.1.0-beta3.tar.gz && rm v2.1.0-beta3.tar.gz && cd luajit-2.1.0-beta3 && \ - # make && sudo make install && sudo ln -sf luajit-2.1.0-beta3 /usr/local/bin/luajit && cd .. && rm -rf luajit-2.1.0-beta3 - # git clone https://github.com/ligurio/luzer.git && \ - # cd luzer && git checkout 6e3276c5e6faf18c8c98637162bea0a23f0cd1d3 && luarocks --local build && cd .. - # export LUA_CPATH="/home/runner/work/casr/casr/luzer/build.luarocks/luzer/?.so;$LUA_CPATH" + wget https://luarocks.org/releases/luarocks-3.11.1.tar.gz && tar zxpf luarocks-3.11.1.tar.gz && \ + cd luarocks-3.11.1 && ./configure && make && sudo make install && cd .. && rm -rf luarocks-3.11.1.tar.gz luarocks-3.11.1 + eval $(luarocks path) + wget https://github.com/tarantool/luajit/archive/refs/tags/v2.1.0-beta3.tar.gz && \ + tar zxpf v2.1.0-beta3.tar.gz && rm v2.1.0-beta3.tar.gz && cd luajit-2.1.0-beta3 && \ + make && sudo make install && sudo ln -sf luajit-2.1.0-beta3 /usr/local/bin/luajit && cd .. && rm -rf luajit-2.1.0-beta3 + git clone https://github.com/ligurio/luzer.git && \ + cd luzer && git checkout 6e3276c5e6faf18c8c98637162bea0a23f0cd1d3 && luarocks --local build && cd .. + export LUA_CPATH="/home/runner/work/casr/casr/luzer/build.luarocks/luzer/?.so;$LUA_CPATH" pip3 install atheris sudo mkdir -p /etc/apt/keyrings curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg diff --git a/casr/tests/tests.rs b/casr/tests/tests.rs index d06a16e8..e2d37e0b 100644 --- a/casr/tests/tests.rs +++ b/casr/tests/tests.rs @@ -5020,9 +5020,9 @@ fn test_casr_lua() { #[test] #[cfg(target_arch = "x86_64")] fn test_casr_libfuzzer_luzer() { - if lsb_release::info().unwrap().version != "24.04" { - return; - } + // if lsb_release::info().unwrap().version != "24.04" { + // return; + // } use std::collections::HashMap; From a59d999b46a53e67bbd1886908143ec12562c307 Mon Sep 17 00:00:00 2001 From: Darya Parygina Date: Tue, 18 Mar 2025 15:19:30 +0300 Subject: [PATCH 10/11] Exclude test from coverage pipeline --- .github/workflows/coverage.yaml | 15 +++------------ casr/tests/tests.rs | 4 ---- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index dd998ae3..66195b2b 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -19,16 +19,7 @@ jobs: - name: Install Dependences run: | sudo apt update && sudo apt install -y gdb pip curl python3-dev llvm \ - openjdk-17-jdk ca-certificates gnupg lua5.4 liblua5.4-dev libcurl4-gnutls-dev - wget https://luarocks.org/releases/luarocks-3.11.1.tar.gz && tar zxpf luarocks-3.11.1.tar.gz && \ - cd luarocks-3.11.1 && ./configure && make && sudo make install && cd .. && rm -rf luarocks-3.11.1.tar.gz luarocks-3.11.1 - eval $(luarocks path) - wget https://github.com/tarantool/luajit/archive/refs/tags/v2.1.0-beta3.tar.gz && \ - tar zxpf v2.1.0-beta3.tar.gz && rm v2.1.0-beta3.tar.gz && cd luajit-2.1.0-beta3 && \ - make && sudo make install && sudo ln -sf luajit-2.1.0-beta3 /usr/local/bin/luajit && cd .. && rm -rf luajit-2.1.0-beta3 - git clone https://github.com/ligurio/luzer.git && \ - cd luzer && git checkout 6e3276c5e6faf18c8c98637162bea0a23f0cd1d3 && luarocks --local build && cd .. - export LUA_CPATH="/home/runner/work/casr/casr/luzer/build.luarocks/luzer/?.so;$LUA_CPATH" + openjdk-17-jdk ca-certificates gnupg lua5.4 pip3 install atheris sudo mkdir -p /etc/apt/keyrings curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg @@ -54,8 +45,8 @@ jobs: run: | rustup component add llvm-tools-preview cargo +nightly build --all-features --verbose - cargo +nightly test --verbose --lib -- --test-threads 1 - cargo +nightly test --verbose --package casr + cargo +nightly test --verbose --lib -- --test-threads 1 --skip test_casr_libfuzzer_luzer + cargo +nightly test --verbose --package casr -- --skip test_casr_libfuzzer_luzer - name: Collect Coverage run: | mkdir target/coverage diff --git a/casr/tests/tests.rs b/casr/tests/tests.rs index e2d37e0b..20179484 100644 --- a/casr/tests/tests.rs +++ b/casr/tests/tests.rs @@ -5020,10 +5020,6 @@ fn test_casr_lua() { #[test] #[cfg(target_arch = "x86_64")] fn test_casr_libfuzzer_luzer() { - // if lsb_release::info().unwrap().version != "24.04" { - // return; - // } - use std::collections::HashMap; let paths = [ From c07d9768f3ed4cc2c96e65f766a6eaf4724376ab Mon Sep 17 00:00:00 2001 From: Antwy <38584695+Antwy@users.noreply.github.com> Date: Wed, 19 Mar 2025 18:32:31 +0300 Subject: [PATCH 11/11] amd64 workflow: install lua5.4 from source & update luzer version --- .github/workflows/amd64.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/amd64.yml b/.github/workflows/amd64.yml index ec5e4caf..6bf3868f 100644 --- a/.github/workflows/amd64.yml +++ b/.github/workflows/amd64.yml @@ -22,7 +22,11 @@ jobs: - name: Run tests run: | sudo apt update && sudo apt install -y gdb pip curl python3-dev llvm \ - openjdk-17-jdk ca-certificates gnupg lua5.4 liblua5.4-dev libcurl4-gnutls-dev + openjdk-17-jdk ca-certificates gnupg libcurl4-gnutls-dev + wget https://www.lua.org/ftp/lua-5.4.7.tar.gz && tar zxf lua-5.4.7.tar.gz && cd lua-5.4.7 && \ + sed -i 's/std=gnu99/std=gnu99 -fPIC/1' src/Makefile && \ + sed -i 's/Wextra/Wextra -fPIC/1' src/Makefile && make all test && sudo make install + ln -s $(which lua) $(which lua)5.4 wget https://luarocks.org/releases/luarocks-3.11.1.tar.gz && tar zxpf luarocks-3.11.1.tar.gz && \ cd luarocks-3.11.1 && ./configure && make && sudo make install && cd .. && rm -rf luarocks-3.11.1.tar.gz luarocks-3.11.1 eval $(luarocks path) @@ -30,7 +34,7 @@ jobs: tar zxpf v2.1.0-beta3.tar.gz && rm v2.1.0-beta3.tar.gz && cd luajit-2.1.0-beta3 && \ make && sudo make install && sudo ln -sf luajit-2.1.0-beta3 /usr/local/bin/luajit && cd .. && rm -rf luajit-2.1.0-beta3 git clone https://github.com/ligurio/luzer.git && \ - cd luzer && git checkout 6e3276c5e6faf18c8c98637162bea0a23f0cd1d3 && luarocks --local build && cd .. + cd luzer && git checkout 649289aa945b7d6c1e2c29edccc83fd3fbe70568 && luarocks build --pack-binary-rock && cd .. export LUA_CPATH="/home/runner/work/casr/casr/luzer/build.luarocks/luzer/?.so;$LUA_CPATH" # Atheris fails to install on Ubuntu 24.04, see https://github.com/google/atheris/issues/82 # pip3 install atheris