Security and ML engineering. Final-year B.Tech, CSE (AI and ML), KMIT Hyderabad, graduating 2027.
I build small security systems, measure them properly, and keep the eval scripts in the repo so any number I quote can be re-run by someone else.
Available for a 3 to 6 month internship in security or ML engineering, with a path to full-time.
Email: mohdibadullah24@kmit.edu.in LinkedIn: mohd-ibadullah
Stack. Python, FastAPI, React 19, TypeScript, XLM-RoBERTa, SecureBERT, MuRIL, SHAP, LIME, SQLite, Docker, Docker Compose, Nginx, Prometheus, Chrome Extension (Manifest V3).
What it does. You paste a real email, it routes by language, runs a rule engine plus a model, and returns a risk score with a short plain reason. There is a browser extension so the check happens inside the inbox tab instead of in another window. 420 plus automated tests (backend pytest plus frontend unit tests) run on every push in GitHub Actions, and the model weights are registered with byte size and SHA-256 in the repo.
What I measured.
| Test | Result |
|---|---|
XLM-RoBERTa fine-tuned on 194,269 pooled emails (phishshield_v2/config.py), 34,283-email held-out split |
0.965 macro F1, 0.952 phishing recall, 0.999 AUC (not per-language numbers: no public Indic email corpus exists) |
| 220-email adversarial out-of-distribution holdout, scored at every training run | accuracy 0.686, precision 0.604, recall 0.900, F1 0.723, false positive rate 0.49 |
| Whole pipeline through the live scan endpoint | accuracy 0.682, F1 0.685 |
| Manual QA on 100 real inbox emails | about 80 to 85 percent |
| Recall on modern LLM-written and BEC-style mail | 0.0. The rule layer carries those patterns as score boosts, so it is mitigation rather than detection |
| English path (pretrained SecureBERT and MuRIL ensemble with a rule anchor) | not fine-tuned on my data, and the repo says so |
Stack. Python 3.11, FastAPI, Pydantic, Hugging Face Transformers, LIME, AgentDojo, pytest.
What it does. Asks one question: does a text classifier in front of an agent that can move money make it safer? I fine-tuned three encoders, ran them as a live gate, then replaced the gate with a lock on the tool call itself. Classifying untrusted text turned out to be the wrong layer; locking the action is the right one. The frozen eval set, the scoring files and an offline console demo are in the repo, and 90 pytest tests pass in CI.
What I measured.
| Defence, over 144 frozen AgentDojo banking episodes and 16 benign tasks | Attack success | Benign tasks usable |
|---|---|---|
| None | 65.97 percent (95/144) | 13/16 |
| Detector only, a majority-vote ensemble of RoBERTa, SecureBERT and DistilBERT | 70.14 percent (101/144) | 11/16 |
| Contract gate on the tool call | 0.00 percent | 10/16 |
| Destination and amount locked to user text, with argument-level taint tracking | 0.00 percent | 7/16 |
The detector caught 0 of 125 live injected payloads, which is why it was dropped rather than tuned.
Stack. Python, PyTorch, sentence-transformers (bge-base-en-v1.5), ettin cross-encoder, BM25, RapidFuzz, Streamlit, pytest.
What it does. Ranks 100,000 candidate profiles against a job description on CPU only, using BM25 plus dense retrieval and a cross-encoder rerank, with a honeypot detector that vetoes keyword-stuffed profiles and a SHA-256 corpus guard against a silently corrupted dataset.
What I measured.
| Check | Result |
|---|---|
| Name-blindness, by construction and verified | 800 of 800 name swaps returned identical rankings |
| Identity-strip invariance | RBO 1.000, against 0.669 for dense retrieval alone |
| Bias in my own scoring rule | an employer-name penalty, Fisher exact p = 0.0046 at top 20, disclosed instead of removed |
| Benchmark | TalentCLEF 2026 Task A with human qrels |
Stack. Node.js 20, Express 5, Socket.IO, MongoDB, Redis, React 19, Vite, Tailwind, Cloudinary.
What it does. My engineering baseline: 30-plus REST endpoints, two React frontends, JWT auth with an admin role gate, Helmet headers, rate limiting, Redis cache-aside with an in-memory fallback, play-count dedupe under concurrent handlers, plus socket auth on the handshake token. Playlist generation never lets the model pick tracks; it returns an intent that is parsed into a Mongo query, so a hallucinated id cannot reach the database.
What I measured. No model benchmark here, it is service work. CI on every push runs server tests, client and admin lint and build, and a high-severity audit check.
Four pull requests merged into homelab-monitor, a self-hosted host and GPU monitoring tool: a services tab fix, a Telegram alerting channel, an MCP status pill, and SQLite backup and restore. Reading production code I did not write, then fixing it inside a real codebase, is how I learn a stack.
- ML and NLP: scikit-learn, TF-IDF
- Backend and serving: Uvicorn, RBAC
- Data and infra: pandas, NumPy
- Evaluation: held-out splits, adversarial and OOD holdouts, nDCG, Fisher exact tests, fixed seeds, frozen artifacts
- Security domain: SPF, DKIM and DMARC checks, prompt-injection threat modelling, phishing triage, IAM basics in progress
- B.Tech, CSE (AI and ML), KMIT, Hyderabad, 2024 to 2027. CGPA 9.29 out of 10
- Diploma, CSE, Mahaveer Institute of Science and Technology, 2021 to 2024. CGPA 9.33 out of 10
- Cybersecurity: Tata Cybersecurity Analyst job simulation, Forage, 2026. IAM, access control, security documentation
- Full stack: Delta Full Stack Web Development, Apna College, 2024
- Training: Python industrial training, RKJ Technologies, Jun to Nov 2023, during the diploma



