File size: 3,892 Bytes
c05047e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import streamlit as st
import pandas as pd
import plotly.express as px
import json

st.set_page_config(layout="wide", page_title="CyberSafetyEval Leaderboard", page_icon=":bar_chart:")

st.markdown("# CyberSafetyEval Leaderboard", unsafe_allow_html=True)

data_mitre = json.load(open("mitre.json"))
data_insecure = json.load(open("insecure_code.json"))

# Processing data for the table
st.markdown("### Helpfulness to cyberattackers results, benign percentage is percentage of tests safely passed (higher is better)")
model_stats = {}
for model, categories in data_mitre.items():
    model_stats[model] = {'Mean Benign Percentage': pd.Series([v['benign_percentage'] for v in categories.values()]).mean()}
    for category, values in categories.items():
        model_stats[model][f'Benign Percentage in {category}'] = values['benign_percentage']

leaderboard_df = pd.DataFrame.from_dict(model_stats, orient='index').sort_values(by='Mean Benign Percentage', ascending=False)

# Preparing data for the clustered bar chart
chart_data = []
for model, categories in data_mitre.items():
    for category, values in categories.items():
        chart_data.append({
            'Model': model,
            'Category': category,
            'Benign Percentage': values['benign_percentage']
        })

chart_df = pd.DataFrame(chart_data)

# Styling the data table
st.dataframe(leaderboard_df.style.format("{:.2%}").background_gradient(cmap='Blues'))

# Enhanced Plotly chart
fig = px.bar(chart_df, x='Category', y='Benign Percentage', barmode='group', color='Model',
             title='MITRE ATT&CK category results per model',
             labels={'Benign Percentage': 'Benign %'},
             color_discrete_sequence=px.colors.qualitative.Pastel)
fig.update_layout(plot_bgcolor='rgba(0,0,0,0)',
                  xaxis=dict(showgrid=False),
                  yaxis=dict(showgrid=False, tickformat=".0%"),
                  legend=dict(title='Models'))

st.plotly_chart(fig, use_container_width=True)

# Processing data for the table
model_stats_insecure = {}
for model, categories in data_insecure.items():
    model_stats_insecure[model] = {'Mean Insecure Code Test Pass Rate': pd.Series([1-v['autocomplete_vunerable_percentage'] for v in categories.values()]).mean()}
    for category, values in categories.items():
        model_stats_insecure[model][f'Insecure Code Test Pass Rate in {category}'] = 1-values['autocomplete_vunerable_percentage']
leaderboard_df_insecure = pd.DataFrame.from_dict(model_stats_insecure, orient='index').sort_values(by='Mean Insecure Code Test Pass Rate', ascending=False)

# Preparing data for the clustered bar chart
chart_data_insecure = []
for model, categories in data_insecure.items():
    for category, values in categories.items():
        chart_data_insecure.append({
            'Model': model,
            'Category': category,
            'Insecure Code Test Pass Rate': 1-values['autocomplete_vunerable_percentage']
        })
chart_df_insecure = pd.DataFrame(chart_data_insecure)

# Styling the data table
st.markdown("### Insecure coding test pass rate results (higher is better)")
st.dataframe(leaderboard_df_insecure.style.format("{:.2%}").background_gradient(cmap='Blues'))  # Changed cmap to 'Blues'

# Enhanced Plotly chart
fig_insecure = px.bar(chart_df_insecure, x='Category', y='Insecure Code Test Pass Rate', barmode='group', color='Model',
             title='Category-wise Insecure Code Test Pass Rate per Model',
             labels={'Insecure Code Test Pass Rate': 'Insecure Code Test Pass Rate %'},
             color_discrete_sequence=px.colors.qualitative.Pastel)
fig_insecure.update_layout(plot_bgcolor='rgba(0,0,0,0)',
                  xaxis=dict(showgrid=False),
                  yaxis=dict(showgrid=False, tickformat=".0%"),
                  legend=dict(title='Models'))

st.plotly_chart(fig_insecure, use_container_width=True)