SlideShare a Scribd company logo
Join the conversation #devseccon
By Justin Collins (@presidentbeef)
Practical Static Analysis
for Continuous
Application Security
@presidentbeef
Background
2
@presidentbeef
Static analysis security tool
for Ruby on Rails
3
@presidentbeef
Definitions
4
Continuous Security
Automated, always-on processes for
detecting potential security vulnerabilities
5
Static Analysis
Information determined about a program
without actually running the code
6
Practical Static Analysis
Things you can reasonably implement
after this workshop
7
Why Static Analysis?
Fast
Run anytime
Easy to automate
Points directly at suspect code
8
Tool Cycle
Run Tool Wait Interpret Results Fix Issues
Repeat
9
@presidentbeef
Getting Started
10
1 - Identify a Problem
Repeated incidents with the same root cause
Opt-in security, e.g. in APIs
Unsafe calls/settings no one should use, ever
11
2 - Identify a Solution
Write a safer library
Make security opt-out
Detect unsafe calls/settings/API usage
12
3 - Enforce the Solution
Write tests
Use static analysis
Use dynamic analysis
13
4 - Automate Enforcement
Part of continuous integration
Part of code review
Standalone, continuously-running process
Local scripts/hooks
14
@presidentbeef
Automation Strategies
15
Continuous Integration
16
Code Review
17
Deployment Gate
18
Separate Process
19
Local Tests/Git Hook
20
@presidentbeef
Scenario
21
@presidentbeef
ssh
devseccon@chairman.presidentbeef.com
devseccon2016
github.com/presidentbeef/devseccon
22
1 - Identify a Problem
delete_survey(survey_id)
23
2 - Identify a Solution
delete_survey(survey_id, user_id)
24
3 - Enforce the Solution
Use static analysis to check for use
25
@presidentbeef
Statically Analyzing
26
Regular Expressions
• grep
• ack
• ag
• …or build your own
27
grep/ack
grep -R "delete_survey([^,)]+)" *
ack "delete_survey([^,)]+)" --type=python
28
Changed
Files
grep
file1
file2
file3
...
Desired Flow
29
Bash
git checkout $@ --quiet
files=$(git diff --name-status master HEAD | grep -E "^(A|M)" | cut -f 2)
grep "delete_survey([^,)]+)" $files
30
git diff --name-status
A README.md
M lib/blah.py
M lib/a.rb
M lib/version.rb
D test/new_stuff.yml
31
Bash
git checkout $@ --quiet
files=$(git diff --name-status master HEAD | grep -E "^(A|M)" | cut -f 2)
grep "delete_survey([^,)]+)" $files
32
Bash
bash check_stuff.sh 9c2ca25
33
Changed
Files
Rules
file1 - warning X
file2 - warning Y
file3 - warning X
...
Multiple Rules
34
Create a Rule
class CheckSurvey < Rule
def run(file_name, code)
if code =~ /delete_survey([^,)]+)/
warn file_name, "delete_survey without user ID"
end
end
end
35
Base Rule Class
class Rule
@rules = []
@warnings = []
def self.inherited klass
@rules << klass
end
def self.run_rules files
files.each do |name|
code = File.read(name)
@rules.each do |r|
r.new.run(name, code)
end
end
end
def self.warnings
@warnings
end
def warn file_name, msg
Rule.warnings << [file_name, msg]
end
end 36
Code to Run It
system "git checkout #{ARGV[0]}"
files = `git diff --name-status master HEAD | grep -E "^(A|M)" | cut -f 2`
Rule.run_rules(files.split)
Rule.warnings.each do |file_name, message|
puts "#{message} in #{file_name}"
end
if Rule.warnings.any?
exit 1
end
37
Ruby
ruby check_delete.rb 9c2ca25
38
False Positives
# Remember not to use delete_survey(survey_id)!
function delete_survey(node) {...}
39
False Negatives
delete_survey(input.split(",")[0])
40
@presidentbeef
Abstract Syntax Trees
41
@presidentbeef
delete_survey(survey_id)
call
args
local
nil
"delete_survey"
"survey_id"
42
S-Expressions
(call nil "delete_survey" (local "survey_id"))
delete_survey(survey_id)
43
Ruby (RubyParser)
s(:call, nil, :delete_survey, s(:call, nil, :survey_id))
RubyParser.new.parse("delete_survey(survey_id")
44
Python (Astroid)
Module()
body = [
Discard()
value =
CallFunc()
func =
Name(delete_survey)
args = [
Name(survey_id)
]
starargs =
kwargs =
]
AstroidBuilder().string_build("delete_survey(survey_id)"
)
45
JavaScript (Esprima)
{
"type": "Program",
"body": [
{
"type": "ExpressionStatement",
"expression": {
"type": "CallExpression",
"callee": {
"type": "Identifier",
"name": "delete_survey"
},
"arguments": [
{
"type": "Identifier",
"name": "survey_id"
}
]
}
}
],
"sourceType": "script"
}
esprima.parse("delete_survey(survey_id)")
46
@presidentbeef
Existing Tools
47
@presidentbeef
Bandit
48
https://github.com/openstack/bandit
Bandit Custom Rule
import bandit
from bandit.core import test_properties as test
@test.checks('Call')
@test.test_id('B350')
def unsafe_get_survey(context):
if (context.call_function_name_qual == 'delete_survey' and
context.call_args_count < 2):
return bandit.Issue(
severity=bandit.HIGH,
confidence=bandit.HIGH,
text="Use of delete_survey without user ID."
) 49
Bandit Custom Warning
50
brakeman.org
51
Brakeman Custom Check
require 'brakeman/checks/base_check'
class Brakeman::CheckDeleteSurvey < Brakeman::BaseCheck
Brakeman::Checks.add self
Brakeman::WarningCodes::Codes[:get_survey] = 2001
@description = "Finds delete_survey calls without a user_id"
def run_check
@tracker.find_call(target: false, method: :delete_survey).each do |result|
next if duplicate? result
add_result result
if result[:call].second_arg.nil?
warn :result => result,
:warning_type => "Direct Object Reference",
:warning_code => :get_survey,
:message => "Use of get_survey without user_id",
:confidence => CONFIDENCE[:high]
end
end
end
end 52
Brakeman Custom Check
brakeman --add-checks-path custom_checks/
53
Brakeman Custom Warning
54
@presidentbeef
Custom Tools
55
@presidentbeef
Esprima
esprima.org
56
JavaScript (Esprima)
{
"type": "Program",
"body": [
{
"type": "ExpressionStatement",
"expression": {
"type": "CallExpression",
"callee": {
"type": "Identifier",
"name": "delete_survey"
},
"arguments": [
{
"type": "Identifier",
"name": "survey_id"
}
]
}
}
],
"sourceType": "script"
}
esprima.parse("delete_survey(survey_id)")
57
Walking Esprima AST
var check_get_survey = function(ast) {
if(ast.type == "CallExpression" &&
ast.callee.type == "Identifier" &&
ast.callee.name == "delete_survey" &&
ast.arguments.length == 1) {
console.log("delete_survey called without user_id at line ",
ast.loc.start)
}
}
var walk = function(ast) {
if(Array.isArray(ast))
{
ast.forEach(walk);
}
else if(ast.type) {
check_get_survey(ast)
for (key in ast) {
walk(ast[key])
}
}
}
var esprima = require('esprima');
walk(esprima.parse('delete_survey(survey_id)', { loc: true }))
58
@presidentbeef
RubyParser
github.com/seattlerb/ruby_parser
59
Ruby (RubyParser)
s(:call, nil, :delete_survey, s(:call, nil, :survey_id))
RubyParser.new.parse("get_survey(survey_id")
60
Walking RubyParser AST
require 'ruby_parser'
require 'sexp_processor'
class FindGetSurvey < SexpInterpreter
def process_call exp
if exp[1].nil? and
exp[2] == :delete_survey and
exp[4].nil?
puts "delete_survey called without user_id at line #{exp.line}"
end
end
end
ast = RubyParser.new.parse "delete_survey(survey_id)"
FindGetSurvey.new.process ast
61
Summary
Start small: identify single issue to solve
Tailor solution to your environment
Automate enforcement
62
Join the conversation #devseccon
Thank You
Source Code:
https://github.com/presidentbeef/devseccon

More Related Content

What's hot (20)

PDF
DevSecCon London 2017 - MacOS security, hardening and forensics 101 by Ben Hu...
DevSecCon
 
ODP
OWASP 2014 AppSec EU ZAP Advanced Features
Simon Bennetts
 
PDF
DBI-Assisted Android Application Reverse Engineering
Sahil Dhar
 
PDF
Fantastic Red Team Attacks and How to Find Them
Ross Wolf
 
PDF
Android Tamer: Virtual Machine for Android (Security) Professionals
Anant Shrivastava
 
PDF
The Hunter Games: How to Find the Adversary with Event Query Language
Ross Wolf
 
PDF
Open Canary - novahackers
Chris Gates
 
PDF
Csw2016 d antoine_automatic_exploitgeneration
CanSecWest
 
PPTX
An experiment in agile threat modelling
DevSecCon
 
ODP
OWASP 2013 APPSEC USA Talk - OWASP ZAP
Simon Bennetts
 
ODP
BlackHat 2014 OWASP ZAP Turbo Talk
Simon Bennetts
 
PDF
Frida Android run time hooking - Bhargav Gajera & Vitthal Shinde
NSConclave
 
ODP
OWASP 2012 AppSec Dublin ZAP Intro
Simon Bennetts
 
PDF
Villegas first pacsec_2016
PacSecJP
 
PPTX
DevOOPS: Attacks and Defenses for DevOps Toolchains
Chris Gates
 
PDF
[CONFidence 2016] Leszek Miś - Honey(pot) flavored hunt for cyber enemy
PROIDEA
 
ODP
OWASP 2013 APPSEC USA ZAP Hackathon
Simon Bennetts
 
PDF
Introduction to Frida
AbhishekJaiswal270
 
PPTX
Nginx warhead
Sergey Belov
 
PDF
Oscp preparation
Manich Koomsusi
 
DevSecCon London 2017 - MacOS security, hardening and forensics 101 by Ben Hu...
DevSecCon
 
OWASP 2014 AppSec EU ZAP Advanced Features
Simon Bennetts
 
DBI-Assisted Android Application Reverse Engineering
Sahil Dhar
 
Fantastic Red Team Attacks and How to Find Them
Ross Wolf
 
Android Tamer: Virtual Machine for Android (Security) Professionals
Anant Shrivastava
 
The Hunter Games: How to Find the Adversary with Event Query Language
Ross Wolf
 
Open Canary - novahackers
Chris Gates
 
Csw2016 d antoine_automatic_exploitgeneration
CanSecWest
 
An experiment in agile threat modelling
DevSecCon
 
OWASP 2013 APPSEC USA Talk - OWASP ZAP
Simon Bennetts
 
BlackHat 2014 OWASP ZAP Turbo Talk
Simon Bennetts
 
Frida Android run time hooking - Bhargav Gajera & Vitthal Shinde
NSConclave
 
OWASP 2012 AppSec Dublin ZAP Intro
Simon Bennetts
 
Villegas first pacsec_2016
PacSecJP
 
DevOOPS: Attacks and Defenses for DevOps Toolchains
Chris Gates
 
[CONFidence 2016] Leszek Miś - Honey(pot) flavored hunt for cyber enemy
PROIDEA
 
OWASP 2013 APPSEC USA ZAP Hackathon
Simon Bennetts
 
Introduction to Frida
AbhishekJaiswal270
 
Nginx warhead
Sergey Belov
 
Oscp preparation
Manich Koomsusi
 

Viewers also liked (20)

PDF
DevSecCon Asia 2017 - Abhay Bhargav: Building an Application Vulnerability To...
DevSecCon
 
PPTX
DevSecCon Asia 2017 Joel Divekar: Using Open Source Automation tools for DevS...
DevSecCon
 
PPTX
DevSecCon Asia 2017 Shannon Lietz: Security is Shifting Left
DevSecCon
 
PDF
Securing the container DevOps pipeline by William Henry
DevSecCon
 
PDF
DevSecCon Asia 2017 Ante Gulam: Integrating crowdsourced security into agile ...
DevSecCon
 
PDF
DevSecCon Asia 2017 Fabian Lim: DevSecOps in the government
DevSecCon
 
PPTX
Matt carroll - "Security patching system packages is fun" said no-one ever
DevSecCon
 
PPTX
Elizabeth Lawler - Devops, security, and compliance working in unison
DevSecCon
 
PPTX
S360 2015 dev_secops_program
Shannon Lietz
 
PPTX
DevSecCon KeyNote London 2015
Shannon Lietz
 
PDF
DevSecCon Asia 2017: Guillaume Dedrie: A trip through the securitiy of devops...
DevSecCon
 
PPTX
DevSecCon Asia 2017 Arun N: Securing chatops
DevSecCon
 
PDF
Renato Rodrigues - Security in the wild
DevSecCon
 
PDF
DevSecOps in Baby Steps
Priyanka Aash
 
PDF
DevSecOps - The big picture
Stefan Streichsbier
 
PDF
DevSecOps - Building Rugged Software
SeniorStoryteller
 
PPTX
Implementing an Application Security Pipeline in Jenkins
Suman Sourav
 
PPTX
DevSecCon Keynote
Shannon Lietz
 
PPTX
Security as Code owasp
Shannon Lietz
 
PPTX
Cloud Security Essentials 2.0 at RSA
Shannon Lietz
 
DevSecCon Asia 2017 - Abhay Bhargav: Building an Application Vulnerability To...
DevSecCon
 
DevSecCon Asia 2017 Joel Divekar: Using Open Source Automation tools for DevS...
DevSecCon
 
DevSecCon Asia 2017 Shannon Lietz: Security is Shifting Left
DevSecCon
 
Securing the container DevOps pipeline by William Henry
DevSecCon
 
DevSecCon Asia 2017 Ante Gulam: Integrating crowdsourced security into agile ...
DevSecCon
 
DevSecCon Asia 2017 Fabian Lim: DevSecOps in the government
DevSecCon
 
Matt carroll - "Security patching system packages is fun" said no-one ever
DevSecCon
 
Elizabeth Lawler - Devops, security, and compliance working in unison
DevSecCon
 
S360 2015 dev_secops_program
Shannon Lietz
 
DevSecCon KeyNote London 2015
Shannon Lietz
 
DevSecCon Asia 2017: Guillaume Dedrie: A trip through the securitiy of devops...
DevSecCon
 
DevSecCon Asia 2017 Arun N: Securing chatops
DevSecCon
 
Renato Rodrigues - Security in the wild
DevSecCon
 
DevSecOps in Baby Steps
Priyanka Aash
 
DevSecOps - The big picture
Stefan Streichsbier
 
DevSecOps - Building Rugged Software
SeniorStoryteller
 
Implementing an Application Security Pipeline in Jenkins
Suman Sourav
 
DevSecCon Keynote
Shannon Lietz
 
Security as Code owasp
Shannon Lietz
 
Cloud Security Essentials 2.0 at RSA
Shannon Lietz
 
Ad

Similar to Justin collins - Practical Static Analysis for continuous application delivery (20)

PDF
Sec4dev 2021 - Catch Me If You can : Continuous Delivery vs. Security Assurance
Abdessamad TEMMAR
 
PPTX
Securing the continuous integration
Irene Michlin
 
PDF
Secure Programming With Static Analysis
ConSanFrancisco123
 
PPTX
Static Code Analysis PHP[tek] 2023
Scott Keck-Warren
 
PPTX
Automatically Identifying the Quality of Developer Chats for Post Hoc Use
Preetha Chatterjee
 
PDF
Exploratory Testing As Code Eurostar23
Brendan Connolly
 
PDF
Exploratory Testing As Code
Brendan Connolly
 
KEY
Hidden treasures of Ruby
Tom Crinson
 
PDF
JRuby 9000 - Optimizing Above the JVM
Charles Nutter
 
PDF
Effective code reviews
Sebastian Marek
 
PDF
Vulnerability Detection Based on Git History
Kenta Yamamoto
 
PDF
Ln monitoring repositories
snyff
 
PDF
Effective code reviews
Sebastian Marek
 
PDF
Getting Ahead of Delivery Issues with Deep SDLC Analysis by Donald Belcham
.NET Conf UY
 
PPTX
Extracting Archival-Quality Information from Software-Related Chats
Preetha Chatterjee
 
PDF
Feature-Oriented Software Evolution
Leonardo Passos
 
PDF
DevSecOps and the CI/CD Pipeline
James Wickett
 
PPTX
Reducing Bugs With Static Code Analysis php tek 2025
Scott Keck-Warren
 
PDF
Keeping objects healthy with Object::Exercise.
Workhorse Computing
 
PPT
Perl Intro 3 Datalog Parsing
Shaun Griffith
 
Sec4dev 2021 - Catch Me If You can : Continuous Delivery vs. Security Assurance
Abdessamad TEMMAR
 
Securing the continuous integration
Irene Michlin
 
Secure Programming With Static Analysis
ConSanFrancisco123
 
Static Code Analysis PHP[tek] 2023
Scott Keck-Warren
 
Automatically Identifying the Quality of Developer Chats for Post Hoc Use
Preetha Chatterjee
 
Exploratory Testing As Code Eurostar23
Brendan Connolly
 
Exploratory Testing As Code
Brendan Connolly
 
Hidden treasures of Ruby
Tom Crinson
 
JRuby 9000 - Optimizing Above the JVM
Charles Nutter
 
Effective code reviews
Sebastian Marek
 
Vulnerability Detection Based on Git History
Kenta Yamamoto
 
Ln monitoring repositories
snyff
 
Effective code reviews
Sebastian Marek
 
Getting Ahead of Delivery Issues with Deep SDLC Analysis by Donald Belcham
.NET Conf UY
 
Extracting Archival-Quality Information from Software-Related Chats
Preetha Chatterjee
 
Feature-Oriented Software Evolution
Leonardo Passos
 
DevSecOps and the CI/CD Pipeline
James Wickett
 
Reducing Bugs With Static Code Analysis php tek 2025
Scott Keck-Warren
 
Keeping objects healthy with Object::Exercise.
Workhorse Computing
 
Perl Intro 3 Datalog Parsing
Shaun Griffith
 
Ad

More from DevSecCon (20)

PDF
DevSecCon London 2019: Workshop: Cloud Agnostic Security Testing with Scout S...
DevSecCon
 
PDF
DevSecCon London 2019: Are Open Source Developers Security’s New Front Line?
DevSecCon
 
PDF
DevSecCon London 2019: How to Secure OpenShift Environments and What Happens ...
DevSecCon
 
PDF
DevSecCon London 2019: A Kernel of Truth: Intrusion Detection and Attestation...
DevSecCon
 
PPTX
DevSecCon Seattle 2019: Containerizing IT Security Knowledge
DevSecCon
 
PPTX
DevSecCon Seattle 2019: Decentralized Authorization - Implementing Fine Grain...
DevSecCon
 
PPTX
DevSecCon Seattle 2019: Liquid Software as the real solution for the Sec in D...
DevSecCon
 
PPTX
DevSecCon Seattle 2019: Fully Automated production deployments with HIPAA/HIT...
DevSecCon
 
PDF
DevSecCon Singapore 2019: Four years of reflection: How (not) to secure Web A...
DevSecCon
 
PPTX
DevSecCon Singapore 2019: crypto jacking: An evolving threat for cloud contai...
DevSecCon
 
PDF
DevSecCon Singapore 2019: Can "dev", "sec" and "ops" really coexist in the wi...
DevSecCon
 
PDF
DevSecCon Singapore 2019: Workshop - Burp extension writing workshop
DevSecCon
 
PDF
DevSecCon Singapore 2019: Embracing Security - A changing DevOps landscape
DevSecCon
 
PDF
DevSecCon Singapore 2019: Web Services aren’t as secure as we think
DevSecCon
 
PDF
DevSecCon Singapore 2019: An attacker's view of Serverless and GraphQL apps S...
DevSecCon
 
PDF
DevSecCon Singapore 2019: The journey of digital transformation through DevSe...
DevSecCon
 
PDF
DevSecCon Singapore 2019: Preventative Security for Kubernetes
DevSecCon
 
PPTX
DevSecCon London 2018: Is your supply chain your achille's heel
DevSecCon
 
PPTX
DevSecCon London 2018: Get rid of these TLS certificates
DevSecCon
 
PDF
DevSecCon London 2018: Open DevSecOps
DevSecCon
 
DevSecCon London 2019: Workshop: Cloud Agnostic Security Testing with Scout S...
DevSecCon
 
DevSecCon London 2019: Are Open Source Developers Security’s New Front Line?
DevSecCon
 
DevSecCon London 2019: How to Secure OpenShift Environments and What Happens ...
DevSecCon
 
DevSecCon London 2019: A Kernel of Truth: Intrusion Detection and Attestation...
DevSecCon
 
DevSecCon Seattle 2019: Containerizing IT Security Knowledge
DevSecCon
 
DevSecCon Seattle 2019: Decentralized Authorization - Implementing Fine Grain...
DevSecCon
 
DevSecCon Seattle 2019: Liquid Software as the real solution for the Sec in D...
DevSecCon
 
DevSecCon Seattle 2019: Fully Automated production deployments with HIPAA/HIT...
DevSecCon
 
DevSecCon Singapore 2019: Four years of reflection: How (not) to secure Web A...
DevSecCon
 
DevSecCon Singapore 2019: crypto jacking: An evolving threat for cloud contai...
DevSecCon
 
DevSecCon Singapore 2019: Can "dev", "sec" and "ops" really coexist in the wi...
DevSecCon
 
DevSecCon Singapore 2019: Workshop - Burp extension writing workshop
DevSecCon
 
DevSecCon Singapore 2019: Embracing Security - A changing DevOps landscape
DevSecCon
 
DevSecCon Singapore 2019: Web Services aren’t as secure as we think
DevSecCon
 
DevSecCon Singapore 2019: An attacker's view of Serverless and GraphQL apps S...
DevSecCon
 
DevSecCon Singapore 2019: The journey of digital transformation through DevSe...
DevSecCon
 
DevSecCon Singapore 2019: Preventative Security for Kubernetes
DevSecCon
 
DevSecCon London 2018: Is your supply chain your achille's heel
DevSecCon
 
DevSecCon London 2018: Get rid of these TLS certificates
DevSecCon
 
DevSecCon London 2018: Open DevSecOps
DevSecCon
 

Recently uploaded (20)

PDF
Cloud Computing Service Availability.pdf
chakrirocky1
 
PPTX
Food_and_Drink_Bahasa_Inggris_Kelas_5.pptx
debbystevani36
 
PPTX
Presentationexpressions You are student leader and have just come from a stud...
BENSTARBEATZ
 
PDF
FINAL ZAKROS - UNESCO SITE CANDICACY - PRESENTATION - September 2024
StavrosKefalas1
 
PPTX
Presentation for a short film .pptx.pptx
madisoncosta17
 
PPTX
Creative perspective presentation copy.pptx
dreamsteel
 
PPT
Wireless Communications Course lecture1.ppt
abdullahyaqot2015
 
PDF
Medical Technology Corporation: Supply Chain Strategy
daretruong
 
PDF
CHALLENGIES FACING THEOLOGICAL EDUCATION IN NIGERIA: STRATEGIES FOR IMPROVEMENT
PREVAILERS THEOLOGICAL SCHOOL FCT ABUJA
 
PPTX
A Mother's Love - Helen Steiner Rice.pptx
AlbertoTierra
 
PDF
Leveraging the Power of Jira Dashboard.pdf
siddharthshukla742740
 
PPTX
Bob Stewart Humble Obedience 07-13-2025.pptx
FamilyWorshipCenterD
 
PDF
From 0 to Gemini: a Workshop created by GDG Firenze
gdgflorence
 
PPTX
677697609-States-Research-Questions-Final.pptx
francistiin8
 
PDF
Generalization predition MOOCs - Conference presentation - eMOOCs 2025
pmmorenom01
 
PPTX
English_Book_2 part 2 let reviewers news
2022mimiacadserver
 
PDF
Mining RACE Newsletter 10 - first half of 2025
Mining RACE
 
PPTX
Speech Act, types of Speech Act in Pragmatics
gracehananatalias
 
PPTX
AI presentation for everyone in every fields
dodinhkhai1
 
PDF
Buy Old GitHub Accounts -Trusted Sellers
GitHub Account
 
Cloud Computing Service Availability.pdf
chakrirocky1
 
Food_and_Drink_Bahasa_Inggris_Kelas_5.pptx
debbystevani36
 
Presentationexpressions You are student leader and have just come from a stud...
BENSTARBEATZ
 
FINAL ZAKROS - UNESCO SITE CANDICACY - PRESENTATION - September 2024
StavrosKefalas1
 
Presentation for a short film .pptx.pptx
madisoncosta17
 
Creative perspective presentation copy.pptx
dreamsteel
 
Wireless Communications Course lecture1.ppt
abdullahyaqot2015
 
Medical Technology Corporation: Supply Chain Strategy
daretruong
 
CHALLENGIES FACING THEOLOGICAL EDUCATION IN NIGERIA: STRATEGIES FOR IMPROVEMENT
PREVAILERS THEOLOGICAL SCHOOL FCT ABUJA
 
A Mother's Love - Helen Steiner Rice.pptx
AlbertoTierra
 
Leveraging the Power of Jira Dashboard.pdf
siddharthshukla742740
 
Bob Stewart Humble Obedience 07-13-2025.pptx
FamilyWorshipCenterD
 
From 0 to Gemini: a Workshop created by GDG Firenze
gdgflorence
 
677697609-States-Research-Questions-Final.pptx
francistiin8
 
Generalization predition MOOCs - Conference presentation - eMOOCs 2025
pmmorenom01
 
English_Book_2 part 2 let reviewers news
2022mimiacadserver
 
Mining RACE Newsletter 10 - first half of 2025
Mining RACE
 
Speech Act, types of Speech Act in Pragmatics
gracehananatalias
 
AI presentation for everyone in every fields
dodinhkhai1
 
Buy Old GitHub Accounts -Trusted Sellers
GitHub Account
 

Justin collins - Practical Static Analysis for continuous application delivery