You can configure the example code provided in multiple ways to get the information you want into Slack.
The key areas are the payload (where the Slack message is configured) and the filtering (where the Snyk information is processed).
Apart from these areas, you also configure the encryption and secret verification. Configuring these is beyond the scope of these instructions.
The following code filters the Snyk payload.
if(snykbody.indexOf("project") !== -1 && snykbody.indexOf("newIssues") !== -1){
// Iterate through new issues
var len = event.body['newIssues'].length;
for(let x=0;x<len;x++){
// Get Severity
let severity = JSON.stringify(event.body['newIssues'][x]['issueData']['severity']);
// Filter
if(severity.includes("high") || severity.includes("critical")){
let snykProjectName = JSON.stringify(event.body['project'].name);
let snykProjectUrl = JSON.stringify(event.body['project'].browseUrl);
let snykIssueUrl = JSON.stringify(event.body['newIssues'][x]['issueData'].url);
let snykIssueId = JSON.stringify(event.body['newIssues'][x].id);
let snykIssuePackage = JSON.stringify(event.body['newIssues'][x].pkgName);
let snykIssuePriority = JSON.stringify(event.body['newIssues'][x]['priority'].score);
let message = "New Snyk Vulnerability";
// Send the result to Slack
const result = await messageSlack(
message,snykProjectUrl,snykProjectName,snykIssuePackage,snykIssueUrl,snykIssueId,severity,snykIssuePriority
);
}
}
You can modify the filter to cover only a specific CWE for example, or to allow all vulnerabilities.
The Slack payload is formatted in the messageSlack function as follows.
async function messageSlack(message,snykProjectUrl,snykProjectName,snykIssuePackage,snykIssueUrl,snykIssueId,severity,snykIssuePriority) {
//strings modified to avoid Axios/Slack errors
snykProjectUrl = snykProjectUrl.replace(/['"]+/g, '')
snykProjectName = snykProjectName.replace(/['"]+/g, '')
snykIssueUrl = snykIssueUrl.replace(/['"]+/g, '')
snykIssueId = snykIssueId.replace(/['"]+/g, '')
snykIssuePackage = snykIssuePackage.replace(/['"]+/g, '')
severity = severity.replace(/['"]+/g, '')
//construct message
let payload = { "text": `${message}`,
"blocks": [
{
"type": "header",
"text": {
"type": "plain_text",
"text": `${message}`,
}
},{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "Snyk has found a new vulnerability in the project:\n*<"+snykProjectUrl+"|"+snykProjectName+">*"
}
},
{
"type": "divider"
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*Package name:*\n"+snykIssuePackage
},
{
"type": "mrkdwn",
"text": "*Vulnerability:*\n<"+snykIssueUrl+"|"+snykIssueId+">"
},
{
"type": "mrkdwn",
"text": "*Severity:*\n"+severity
},
{
"type": "mrkdwn",
"text": "*Priority Score:*\n"+snykIssuePriority
}
]
},
{
"type": "actions",
"elements": [
{
"type": "button",
"text": {
"type": "plain_text",
"text": "View in Snyk"
},
"style": "primary",
"url": snykProjectUrl,
"value": "browseUrl"
}