我通过“破解”规则进入了 YC。
I got into YC (Startup School) by hacking it

原始链接: https://obaid.wtf/jotbook/2026/07/18/how-i-got-into-yc-by-hacking-it.html

在分析 Y Combinator 的“Paxel”应用程序工具(该工具通过扫描代码库来为创始人排名)时,我发现了一个关键漏洞。该系统依赖于未经有效验证的 HMAC,使我能够伪造并上传篡改后的分数到 YC 的数据库中。通过我开发的一款名为“paxel-boosted”的工具,用户可以人为地提高自己的排名,从而进入全球开发者前 1% 的行列。 在最初的私下披露 12 天未获回应后,我公开了调查结果。几个小时内,YC 合伙人 Jared Friedman 确认了该问题,修补了漏洞,并邀请我参加今年夏天在旧金山举办的创业学校(Startup School)。 该漏洞的存在是因为服务器虽然验证了随机数(nonce),但未能对底层的评分数据进行签名,导致任何人都可以拦截并在最终提交前修改其结果。虽然该工具的用户体验极佳,但这提醒我们,去中心化的工作流程需要严谨的加密验证。在修复之后,这次经历已转化为一次积极的社交机会,我目前正寻求与旧金山的同行们建立联系。

一个 Hacker News 讨论帖正在探讨某位用户声称利用名为 Paxel 的工具“黑”进 Y Combinator (YC) 的事件。Paxel 是一款获 YC 支持的诊断工具,旨在通过分析编程代理(coding agent)的记录来评估申请者。 讨论集中在重大的安全和隐私担忧上。评论者对该工具要求申请者运行一段脚本(`curl | bash`)的行为表示惊恐,因为这可能授予该工具对其计算机和专有代码库的高级访问权限,一些用户甚至将其称为一场安全灾难。 关于这次“入侵”的本质也引发了争论——其他人澄清称,这只是获得了一次 YC “创业学校”(Startup School)活动的邀请,而非进入了主要的加速器项目。此外,人们对使用人工智能生成的指标来评估创始人的做法持怀疑态度。许多参与者批评了公司要求进行侵入式数据收集以进行审查的趋势,认为这类“黑箱”工具可能导致错误的评估指标。总体而言,该社区对其中的安全隐患以及创业生态系统中出现的这种“监控式”招聘策略保持着高度警惕。
相关文章

原文

tldr: I uncovered Y Combinator was scoring 100k+ founders around the world through Paxel, I broke it (possible easter egg) + found a vulnerability that let anyone forge and push any score to their ranking database, courtesy of an unvalidated hmac

Latest update: YC admirably, didn’t mind. In just a couple hours after first-public-disclosure Jared Friedman himself replied, announced the patch, and invited me to attend the Startup School in SF this summer! I’d also disclosed it in private through email 12 days earlier to no response. But publicly at least the process works.

this is a re-write of an earlier draft where I first made the disclosure public. it was badly written, sleep-deprived and I didn’t feel good enough about it to publicize

—   —   —

It all started early June, when I found the application form for Startup School 26’ (referred by Dhanush: shoutout Audora S26, incredible stuff coming!!). I found that this year, YC wanted me to use something called Paxel on my computer as part of the application.

I should run a script, a very easy-to-use cURL one-liner that installed something on my computer and analyzed every line of code I’ve written with a coding agent, compile a report, and upload it to YC’s servers.

Paxel’s main site tells me the main feature is I get to “visualize” my work and get assigned fun attributes like “Which archetype are you?” and “What’s your biggest crashout?” That sounded fun.

But I wanted to know exactly how it did that, and when my curiosity starts creeping into obsessive territory it’s basically a toss-up that either ends in a legendary crash-out or doing something great. thankfully, in this case it was the latter.

I also can’t lie: I really wanted (or needed) to hack it. I knew I was starting from a disadvantage when filling out my application (no formal, ivy league education), but I knew this would be a fast-track, surefire way into confirming my acceptance. I’m not delulu, I knew it would be insane if I was able to do it, but why not go all in?

Based on Paxel’s own site, 1.2 million+ coders have so far uploaded their reports to YC. And seeing those numbers it’s honestly shocking I was the first person in the world to figure and break all of this.

—   —   —

As a side note before I get into it, I think the relative achievement of a “hack” in the world has diminished manyfold since agent-capable LLMs have arrived. That of course, pars with reality because of how much easier LLMs have made doing those. But I do think that ease is somewhat overestimated, both because of the many strange blindspots they have as well as the lack of a certain “hacking” or combative approach to intelligence. Whether that’s because of safety-neutering or simply the way they’re trained is a discussion for another time.

So although what they’re world-changing at is helping you go through the same material in 10x, and sometimes 50x less time (research, investigation), it is often a struggle to communicate with LLMs and keep your own mind sharp and independent when LLMs insist everything hackable is not — with near-perfectly plausible logic.

—   —   —

Paxel has an incredible UX, everything it does is handled from a single one-liner curl -fsSL https://paxel.ycombinator.com/upload.sh | bash. It will automatically scan your entire system, prompt you for questions, and handle the upload — you don’t have to worry about a thing after.

So the first starting point, naturally, was this install script. I first split it into 4 separate modules. When I tried breaking it in full every LLM I gave it to started hallucinating really badly (context window size increases are not perfect!)

The install script, turns out, actually didn’t run on its own. It downloaded an entire docker image hosting a ruby app, unwrapped that, and ran it locally through the docker installed on your computer. So the app is actually divided into two parts:

① ─▶ upload.sh 302KB install script. Handles auth, discovers projects, extracts git history, and initializes docker

② ─▶ the ruby app unwrapped from a docker image. it runs the actual full pipeline per-project.

  1. It first groups all chat transcripts into a yc-invented unit of work, “episodes”. Each episode is all the commits per PR, failing that ─▶ Each commit in a 2 hour burst period ─▶ failing that, every single chat session becomes an individual episode.
  2. Then, it uploads them to a yc-sponsored (interesting discovery!) free gpt-5.5 proxy hosted @ paxel-llm.ycombinator.com
  3. gets back a summary per episode, rolls it in with other data, and uploads the final report to paxel.ycombinator.com/api/v1/results

And this is where I found that every piece of work you’ve done has been graded, scored, ranked by YC, and 1.2 million reports on earth’s coders have been compiled.

execution_leverage steering engineering_quality product_thinking planning

These are the core 5 axes the LLM grades you on and assigns a score between 1-10 with free-text notes.

And this, is also where I found the most gaping vulnerability. See, this program is a very good example of a distributed/decentralized app (not everything has be to ran and consolidated on a proprietary server).

But the thing about decentralized apps is they rely heavily on some very basic functions of cryptography. And this pipeline lacked a very, very important one.

The LLM proxy, along with each episode returns a nonce , and this nonce is shared between the LLM servers and upload server. Theoretically, this should be passed from LLM ─▶ local ─▶ POST /v1/results which validates that none other than an original LLM result is accepted by the endpoint.

Theoretically.

What did happen though, is this nonce failed to encode a signature of the LLM’s results, scores, and notes so even though it did validate the nonce (server correctly rejected requests with invalid or missing nonce, and burnt after one use), the missing signature meant the entire episode and its score could be changed to whatever and uploaded to YC.

And YC accepted it.

Not only accepted, but if I buffed the score or changed notes, the report of the same exact project differed wildly.

exact same project, exact same chats.

And I took it a step further. With the same one-liner (I love Paxel’s UX!!) I made paxel-boosted, a hack that let anyone in the world upload forged reports the same by launching a mirroring tool. Self-sponsored the boosting proxy because needing to add env is terrible user experience.

obaid.wtf — bash — boosted-paxel

For the couple hours from publicization to YC announcing the patch, over 20 of my users were able to rank themselves as the world’s top 1% in YC’s database.

two functions of basic cryptography were missing.

LLM proxy responses vs upload payload — which fields are sealable, signable, local, or discarded

blue+green fields need to be signed in the hash. green fields sealed and encrypted as well

We could categorize all the fields accepted by /v1/results into 3 categories (two being important, one covering all others), as visualized above.

1) fields that are passed near-verbatim from LLM ─▶ /v1/results (green+blue-highlighted in the graphic above), these should have all been rolled and hashed together into the nonce as an hmac. Nonces were already validated, and this would make sure each nonce was actually tied to the LLM’s responses.

nonce = hmac(request_id) ─▶ nonce = hmac(request_id + scores.steering + scores.product_thinking + ... + title)

and this is actually the patch YC did deliver and announce, pretty much exactly as I suggested in the original draft.

2) that are (1) passed near-verbatim from the LLM ─▶ /v1/results AND (2) also never used within the client. A subset of the fields above (green-highlighted in the diagram), these should be encrypted with any AEAD cipher (or asymmetric pub/priv keys) only the servers possess and share so the client can’t see details like the 5-axes scoring, episode title, and notes.

This one is optional and is essentially obscurity, but if it had been done from the start, I could have never known what to sniff, what to change, and it would have covered the most serious of impacts from the first vulnerability —

—   —   —

It’s possible that this entire “vulnerability” was a secret easter egg to find out who could hack it, or a honeypot that didn’t throw a validation error but secretly monitored who discovered and was “hacking” around it, but looking at the way this pipeline and Paxel seems to be written makes me think that’s likely not what it was.

Now, since Jared’s reply this has obviously been patched but my tool is still helpful in showing you your raw scores! Feel free to check it out.

if you’ll also be in SF next week (21 jul - 6th aug) around the Startup School dates feel free to reach on Linkedin or Twitter with a tip for places, events, or people where i can find my next co-founder to build something timeline-changing with — and we can connect.

联系我们 contact @ memedata.com