Harden SSH parsing and add notice tooling
- Enforce exact service and channel names with bounded failure parsing - Add hash-pinned offline notice assembly and regression coverage - Record advisory dispositions, provenance, integration evidence, and remaining gates
This commit is contained in:
@@ -20,6 +20,8 @@ typedef uint32_t word32;
|
||||
#define WS_CRYPTO_FAILED -7
|
||||
#define WS_ECC_E -8
|
||||
#define WS_ED25519_E -9
|
||||
#define WS_INVALID_STATE_E -10
|
||||
#define WS_CHANOPEN_FAILED -11
|
||||
#define MSGID_USERAUTH_REQUEST 50
|
||||
#define MSG_ID_SZ 1
|
||||
#define BOOLEAN_SZ 1
|
||||
@@ -141,10 +143,10 @@ static void parsers(byte *end)
|
||||
assert(DoIgnore(&ssh,p,n,&idx)==(good?0:WS_BUFFER_E));
|
||||
if (good) assert(idx==4+lengths[j]);
|
||||
idx=0; ssh.clientState=9;
|
||||
int service=good && lengths[j]<WOLFSSH_MAX_NAMESZ;
|
||||
assert(DoServiceRequest(&ssh,p,n,&idx)==(service?0:WS_BUFFER_E));
|
||||
assert(ssh.clientState==(service?42:9));
|
||||
assert(idx==(service?4+lengths[j]:0));
|
||||
int bounded=good && lengths[j]<WOLFSSH_MAX_NAMESZ;
|
||||
assert(DoServiceRequest(&ssh,p,n,&idx)==
|
||||
(bounded?WS_INVALID_STATE_E:WS_BUFFER_E));
|
||||
assert(ssh.clientState==9 && idx==0);
|
||||
char out[10]; memset(out, 0x55, sizeof(out));
|
||||
word32 cap=8; idx=0;
|
||||
assert(GetString(out+1,&cap,p,n,&idx)==(good?0:WS_BUFFER_E));
|
||||
@@ -169,7 +171,7 @@ static void parsers(byte *end)
|
||||
byte p[12]={0}; put(p+3,5); word32 idx=3;
|
||||
assert(DoIgnore(&ssh,p,12,&idx)==0 && idx==12);
|
||||
put(p+3,0); idx=3;
|
||||
assert(DoServiceRequest(&ssh,p,7,&idx)==0 && idx==7);
|
||||
assert(DoServiceRequest(&ssh,p,7,&idx)==WS_INVALID_STATE_E && idx==3);
|
||||
}
|
||||
static void windows(byte *end)
|
||||
{
|
||||
@@ -243,12 +245,15 @@ static void ecc(byte *end)
|
||||
}
|
||||
#include "auth_framing.c"
|
||||
|
||||
#include "remaining.c"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
long page=sysconf(_SC_PAGESIZE); assert(page>0);
|
||||
byte *map=mmap(NULL,(size_t)page*2,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0);
|
||||
assert(map!=MAP_FAILED && mprotect(map+page,page,PROT_NONE)==0);
|
||||
parsers(map+page); windows(map+page); ecc(map+page);
|
||||
remaining_parsers(map+page);
|
||||
ecc_framing(map+page); ed25519_framing(map+page);
|
||||
assert(munmap(map,(size_t)page*2)==0);
|
||||
printf("PASS: %u parser/window/ECC/Ed25519 cases, guard pages + UBSan trap\n",cases);
|
||||
|
||||
Reference in New Issue
Block a user