Text Classification
Transformers
Safetensors
English
code
roberta
security
vulnerability-detection
code-analysis
multi-label-classification
graphcodebert
owasp
cwe
static-analysis
Eval Results (legacy)
text-embeddings-inference
Instructions to use ayshajavd/graphcodebert-vuln-classifier with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use ayshajavd/graphcodebert-vuln-classifier with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-classification", model="ayshajavd/graphcodebert-vuln-classifier")# Load model directly from transformers import AutoTokenizer, AutoModelForSequenceClassification tokenizer = AutoTokenizer.from_pretrained("ayshajavd/graphcodebert-vuln-classifier") model = AutoModelForSequenceClassification.from_pretrained("ayshajavd/graphcodebert-vuln-classifier", device_map="auto") - Notebooks
- Google Colab
- Kaggle
| license: apache-2.0 | |
| library_name: transformers | |
| base_model: huggingface/CodeBERTa-small-v1 | |
| tags: | |
| - security | |
| - vulnerability-detection | |
| - code-analysis | |
| - multi-label-classification | |
| - graphcodebert | |
| - owasp | |
| - cwe | |
| - static-analysis | |
| language: | |
| - en | |
| - code | |
| pipeline_tag: text-classification | |
| datasets: | |
| - ayshajavd/code-security-vulnerability-dataset | |
| - bstee615/bigvul | |
| - CyberNative/Code_Vulnerability_Security_DPO | |
| - lemon42-ai/Code_Vulnerability_Labeled_Dataset | |
| model-index: | |
| - name: graphcodebert-vuln-classifier | |
| results: | |
| - task: | |
| type: text-classification | |
| name: Multi-label Vulnerability Classification | |
| dataset: | |
| type: ayshajavd/code-security-vulnerability-dataset | |
| name: Code Security Vulnerability Dataset | |
| split: test | |
| metrics: | |
| - type: f1 | |
| value: 0.8648 | |
| name: Weighted F1 | |
| - type: f1 | |
| value: 0.4575 | |
| name: Micro F1 | |
| - type: f1 | |
| value: 0.9501 | |
| name: F1 (safe class) | |
| - type: recall | |
| value: 0.5018 | |
| name: Macro Recall | |
| # GraphCodeBERT Vulnerability Classifier | |
| A multi-label code vulnerability detection model that identifies **31 vulnerability classes** (30 CWEs + safe) mapped to the **OWASP Top 10 2021** categories. Fine-tuned from [CodeBERTa-small-v1](https://huggingface.co/huggingface/CodeBERTa-small-v1) on 175K+ labeled code samples. | |
| ## Quick Start | |
| ```python | |
| import torch | |
| from transformers import AutoTokenizer, AutoModelForSequenceClassification | |
| model_id = "ayshajavd/graphcodebert-vuln-classifier" | |
| tokenizer = AutoTokenizer.from_pretrained(model_id) | |
| model = AutoModelForSequenceClassification.from_pretrained(model_id) | |
| model.eval() | |
| code = """ | |
| import sqlite3 | |
| def get_user(username): | |
| query = f"SELECT * FROM users WHERE username = '{username}'" | |
| conn = sqlite3.connect('db.sqlite') | |
| return conn.execute(query).fetchone() | |
| """ | |
| inputs = tokenizer(code, return_tensors="pt", max_length=512, truncation=True, padding=True) | |
| with torch.no_grad(): | |
| logits = model(**inputs).logits | |
| probs = torch.sigmoid(logits).squeeze() | |
| # Get predictions above threshold | |
| TARGET_CWES = ["safe", "CWE-20", "CWE-22", "CWE-78", "CWE-79", "CWE-89", "CWE-94", | |
| "CWE-119", "CWE-125", "CWE-190", "CWE-200", "CWE-264", "CWE-269", "CWE-276", | |
| "CWE-284", "CWE-287", "CWE-310", "CWE-327", "CWE-330", "CWE-352", "CWE-362", | |
| "CWE-399", "CWE-401", "CWE-416", "CWE-434", "CWE-476", "CWE-502", "CWE-601", | |
| "CWE-787", "CWE-798", "CWE-918"] | |
| threshold = 0.5 | |
| for i, (cwe, prob) in enumerate(zip(TARGET_CWES, probs)): | |
| if prob > threshold: | |
| print(f"{cwe}: {prob:.3f}") | |
| ``` | |
| ## Model Details | |
| | Property | Value | | |
| |----------|-------| | |
| | **Architecture** | RobertaForSequenceClassification (6 layers, 768 hidden, 83.5M params) | | |
| | **Base Model** | [CodeBERTa-small-v1](https://huggingface.co/huggingface/CodeBERTa-small-v1) | | |
| | **Task** | Multi-label classification (BCEWithLogitsLoss with class weights) | | |
| | **Labels** | 31 (30 CWE categories + "safe") | | |
| | **Max Sequence Length** | 512 tokens | | |
| | **Recommended Threshold** | 0.5 (balanced precision/recall) or 0.3 (high recall, security-first) | | |
| ## Supported Languages | |
| Python, JavaScript, Java, C, C++, PHP, Go | |
| The model was trained on a diverse multi-language dataset. Performance is strongest on C/C++ (largest training subset from BigVul) and Python/JavaScript (from the multi-language datasets). | |
| ## Evaluation Results (Test Set β 5,000 samples) | |
| ### Threshold Comparison | |
| | Threshold | Macro F1 | Micro F1 | Weighted F1 | Macro Precision | Macro Recall | | |
| |-----------|----------|----------|-------------|-----------------|--------------| | |
| | 0.2 | 0.066 | 0.301 | 0.859 | 0.048 | 0.562 | | |
| | **0.3** | **0.081** | **0.458** | **0.865** | **0.057** | **0.502** | | |
| | 0.4 | 0.101 | 0.626 | 0.870 | 0.070 | 0.439 | | |
| | **0.5** | **0.125** | **0.739** | **0.870** | **0.088** | **0.366** | | |
| ### Per-Class Performance (threshold=0.3) | |
| #### OWASP A01:2021 β Broken Access Control | |
| | CWE | Name | Support | Precision | Recall | F1 | | |
| |-----|------|---------|-----------|--------|-----| | |
| | CWE-22 | Path Traversal | 2 | 0.000 | 0.000 | 0.000 | | |
| | CWE-200 | Information Exposure | 30 | 0.063 | 0.800 | 0.117 | | |
| | CWE-264 | Permissions/Privileges | 23 | 0.025 | 0.696 | 0.049 | | |
| | CWE-269 | Improper Privilege Mgmt | 1 | 0.000 | 0.000 | 0.000 | | |
| | CWE-276 | Incorrect Permissions | 0 | β | β | β | | |
| | CWE-284 | Access Control | 5 | 0.000 | 0.000 | 0.000 | | |
| | CWE-352 | CSRF | 1 | 0.000 | 0.000 | 0.000 | | |
| | CWE-601 | Open Redirect | 0 | β | β | β | | |
| #### OWASP A02:2021 β Cryptographic Failures | |
| | CWE | Name | Support | Precision | Recall | F1 | | |
| |-----|------|---------|-----------|--------|-----| | |
| | CWE-310 | Cryptographic Issues | 5 | 0.000 | 0.000 | 0.000 | | |
| | CWE-327 | Broken Crypto Algorithm | 1 | 0.000 | 0.000 | 0.000 | | |
| | CWE-330 | Insufficient Randomness | 1 | 0.000 | 0.000 | 0.000 | | |
| #### OWASP A03:2021 β Injection | |
| | CWE | Name | Support | Precision | Recall | F1 | | |
| |-----|------|---------|-----------|--------|-----| | |
| | CWE-20 | Input Validation | 69 | 0.023 | **0.957** | 0.046 | | |
| | CWE-78 | Command Injection | 1 | 0.011 | **1.000** | 0.021 | | |
| | CWE-79 | XSS | 16 | 0.084 | **0.750** | 0.151 | | |
| | CWE-89 | SQL Injection | 15 | 0.096 | **1.000** | 0.174 | | |
| | CWE-94 | Code Injection | 27 | 0.123 | **1.000** | 0.220 | | |
| | CWE-119 | Buffer Overflow | 118 | 0.088 | **0.898** | 0.160 | | |
| | CWE-125 | Out-of-bounds Read | 35 | 0.048 | **0.829** | 0.091 | | |
| | CWE-190 | Integer Overflow | 14 | 0.033 | **1.000** | 0.064 | | |
| | CWE-401 | Memory Leak | 2 | 0.022 | **1.000** | 0.044 | | |
| | CWE-416 | Use After Free | 20 | 0.048 | 0.400 | 0.086 | | |
| | CWE-476 | NULL Pointer Deref | 30 | 0.032 | **0.867** | 0.061 | | |
| | CWE-787 | Out-of-bounds Write | 46 | 0.052 | **0.891** | 0.099 | | |
| #### OWASP A04:2021 β Insecure Design | |
| | CWE | Name | Support | Precision | Recall | F1 | | |
| |-----|------|---------|-----------|--------|-----| | |
| | CWE-362 | Race Condition | 11 | 0.035 | 0.636 | 0.065 | | |
| | CWE-399 | Resource Management | 21 | 0.008 | **0.857** | 0.015 | | |
| | CWE-434 | File Upload | 0 | β | β | β | | |
| #### OWASP A07βA10 | |
| | CWE | Name | Support | Precision | Recall | F1 | | |
| |-----|------|---------|-----------|--------|-----| | |
| | CWE-287 | Authentication | 0 | β | β | β | | |
| | CWE-798 | Hardcoded Credentials | 0 | β | β | β | | |
| | CWE-502 | Deserialization | 10 | 0.056 | **1.000** | 0.106 | | |
| | CWE-918 | SSRF | 0 | β | β | β | | |
| ### Key Metric: Safe Code Detection | |
| | Class | Support | Precision | Recall | F1 | | |
| |-------|---------|-----------|--------|-----| | |
| | **safe** | **4,496** | **0.927** | **0.975** | **0.950** | | |
| ### Model Strengths | |
| - **Excellent recall** on many vulnerability classes (0.75β1.0 for SQL injection, buffer overflow, XSS, code injection, etc.) | |
| - **Strong safe code detection** (F1=0.95) β reliably identifies secure code | |
| - **High sensitivity** β at threshold 0.3, catches most real vulnerabilities (macro recall=0.50) | |
| ### Model Limitations | |
| - **Low precision on rare classes** β many false positives, especially on CWEs with few training examples | |
| - Precision can be improved by using **threshold=0.5** (macro F1 improves to 0.125 but recall drops) | |
| - Classes with 0 test support cannot be evaluated | |
| > **Design choice:** For security applications, we prioritize recall (catching real vulnerabilities) over precision (reducing false positives). Missing a real vulnerability (false negative) is worse than flagging safe code (false positive). | |
| ## Training Data | |
| The model was trained on the [code-security-vulnerability-dataset](https://huggingface.co/datasets/ayshajavd/code-security-vulnerability-dataset) (175,419 samples), combining: | |
| 1. **[BigVul](https://huggingface.co/datasets/bstee615/bigvul)** β 265K C/C++ vulnerable functions from real CVEs | |
| 2. **[CWE-enriched BigVul/PrimeVul](https://huggingface.co/datasets/mahdin70/cwe_enriched_balanced_bigvul_primevul)** β Balanced CWE-labeled subset | |
| 3. **[Code Vulnerability Labeled](https://huggingface.co/datasets/lemon42-ai/Code_Vulnerability_Labeled_Dataset)** β Multi-language (Python, JS, Java, PHP, Go) | |
| 4. **[CyberNative DPO](https://huggingface.co/datasets/CyberNative/Code_Vulnerability_Security_DPO)** β Vulnerable/secure code pairs | |
| ### Training Configuration | |
| | Parameter | Value | | |
| |-----------|-------| | |
| | Epochs | 2 | | |
| | Batch Size | 8 | | |
| | Learning Rate | 5e-5 | | |
| | Scheduler | Cosine with warmup (50 steps) | | |
| | Loss | BCEWithLogitsLoss (class-weighted, pos_weight clipped to 30x) | | |
| | Training Subset | 20K balanced samples | | |
| | Optimizer | AdamW (fused) | | |
| ## Limitations | |
| 1. **Class imbalance**: Many rare CWE types have very few training examples, leading to high false positive rates | |
| 2. **Sequence length**: Limited to 512 tokens β long functions may be truncated | |
| 3. **Language bias**: Strongest on C/C++ due to BigVul's dominance. Go and PHP performance may be lower | |
| 4. **Single-function analysis**: Analyzes individual functions, not cross-function or cross-file vulnerabilities | |
| 5. **Not a replacement**: Should complement manual review and established SAST tools (Semgrep, CodeQL, etc.) | |
| ## Interactive Demo | |
| Try the model in our [Code Security Analyzer Space](https://huggingface.co/spaces/ayshajavd/code-security-analyzer) β paste any code and get a full security report with OWASP mapping, severity scores, attack chain analysis, and suggested fixes. | |
| ## Citation | |
| ```bibtex | |
| @misc{graphcodebert-vuln-classifier, | |
| title={GraphCodeBERT Vulnerability Classifier: Multi-label CWE Detection Mapped to OWASP Top 10}, | |
| author={ayshajavd}, | |
| year={2025}, | |
| url={https://huggingface.co/ayshajavd/graphcodebert-vuln-classifier} | |
| } | |
| ``` | |